• MySQL之主从复制


    概述:

    将主库的数据 变更同步到从库,从而保证主库和从库数据一致。

    它的作用是 数据备份,失败迁移,读写分离,降低单库读写压力

    原理:

    主服务器上面的任何修改都会保存在二进制日志( Bin-log日志) 里面。 从服务器上面启动一个I/O线程, 连接到主服务器上面请求读取二进制(Bin-log)日志,然后把读取到的二进制日志写到本地的Realy-log(中继日志)里面。 从服务器上面同时开启一个SQL线程,读取Realy-log(中继日志),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。

    搭建:

    1.准备服务器

    2.配置主库

    3.配置从库

    4.测试主从复制

    实践

    1.首先准备俩台安装MySQL的纯净服务器 

    主库:192.168.231.153

    从库:192.168.231.136  

    关闭防火墙与selinux

    在俩台服务器做域名解析

    vim /etc/hosts

    192.168.231.153  master

    192.168.231.136  slave

    1. 俩台服务器都做如下操作:
    2. 同步时间,修改时区
    3. #ntpdate time.windows.com
    4. #timedatectl set-timezero Asia/Shanghai
    5. 修改主机名
    6. #hostnamectl set-hostname zhuku
    7. #hostnamectl set-hostname congku
    8. 配置静态ip
    9. # vim /etc/sysconfig/network-scripts/ifcfg-ens33
    10. 将dhcp改为static
    11. IPADDR=本机ip
    12. GATEWAY=192.168.231.2
    13. NETMASK=255.255.255.0
    14. DNS1=114.114.114.114
    15. DNS2=8.8.8.8

    清理环境在安装MySQL之前

    1. 俩台服务器都需要做的操作
    2. [root@slave ~]#yum -y erase `rpm -qa | grep -E "mysql|mariadb"`
    3. [root@slave ~]# rm -rf /etc/my* /var/lib/mysql* /var/log/mysql*
    4. #检查一下,环境清理干净没有
    5. [root@slave ~]# [[ ! -f /etc/my.cnf ]] && [[ ! -d /var/lib/mysql ]] && [[ ! -f /usr/bin/mysql ]] && echo "数据库已清除" || echo "数据库未清理"

    安装mysql

    1. 启动服务:
    2. # systemctl start mysqld
    3. 寻找密码
    4. grep password /var/log/mysqld.log
    5. 也可以
    6. mysqladmin -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password 'Qianfeng@123'
    7. 这条命令是直接登录MySQL,顺便将密码修改以后 可以登录
    8. 也可以是,获取新的MySQL的密码
    9. # awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log

    2.配置主库:

    创建日志目录并赋予权限

    1. # mkdir /var/log/mysql
    2. # chown -R mysql.mysql /var/log/mysql

    编辑主库服务器的配置文件 /etc/my.cnf

    1. [mysqld]
    2. log-bin=/var/log/mysql/mysql-bin #启用二进制文件日志记录
    3. server-id=1 # 服务id,保证整个集群环境唯一
    4. read-only=0 #1是只读,0是读写

    重启服务

    # systemctl restart mysqld

    在主库登录MySQL,创建用户

    为了用户在从库中用来连接主库的账号

    1. mysql> grant replication slave on *.* to '用户名'@'ip' identified by '密码';
    2. 这是为用户分配主从复制的权限,并创建用户
    3. 刷新:
    4. mysql> flush privileges;

    查看二进制日志坐标

    1. mysql> show master status;
    2. +------------------+----------+--------------+------------------+-------------------+
    3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    4. +------------------+----------+--------------+------------------+-------------------+
    5. | mysql-bin.000001 | 313 | | | |
    6. +------------------+----------+--------------+------------------+-------------------+
    7. 1 row in set (0.00 sec)

    3.配置从库

    编辑从库服务器的配置文件my.cnf

    1. [mysqld]
    2. server-id=2
    3. read-only=1 #普通用户一般只有只读,可以不写

    重启mysql服务

    # systemctl restart mysqld

    登录mysql

    此处登录的是你从库mysql的root用户登录的账号与密码,不是在主库创建的用户

    1. mysql> change master to master_host='主库的ip'
    2. master_user='连接主库用户名',
    3. master_password='连接主库用户的密码',
    4. master_log_file='日志文件名',
    5. mastre_log_pos='日志位置';
    6. 日志位置就是在主库show master status查出来那个数字 ----313
    7. +------------------+----------+--------------+------------------+-------------------+
    8. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    9. +------------------+----------+--------------+------------------+-------------------+
    10. | mysql-bin.000001 | 313 | | | |
    11. +------------------+----------+--------------+------------------+-------------------+

    当你第一次记不住这么多命令时,可以直接

    1. mysql > ? change master to
    2. 出现下列,直接复制
    3. CHANGE MASTER TO
    4. MASTER_HOST='source2.example.com',
    5. MASTER_USER='replication',
    6. MASTER_PASSWORD='password',
    7. MASTER_PORT=3306,
    8. MASTER_LOG_FILE='source2-bin.001',
    9. MASTER_LOG_POS=4,
    10. MASTER_CONNECT_RETRY=10;
    11. 然后: mysql > ?e
    12. 进入文本编辑器内,将复制的 内容进行修改 然后保存即可

    启动:

    mysql> start slave;

    查看主从同步状态:

    1. mysql> show slave status\G
    2. *************************** 1. row ***************************
    3. Slave_IO_State: Waiting for master to send event
    4. Master_Host: 192.168.231.153 -----主库的ip
    5. Master_User: itcast -----用来连接主库的用户名
    6. Master_Port: 3306 ------端口
    7. Connect_Retry: 60
    8. Master_Log_File: mysql-bin.000001 -----二进制日志名字
    9. Read_Master_Log_Pos: 313
    10. Relay_Log_File: congku-relay-bin.000002 -----中继日志名字
    11. Relay_Log_Pos: 479
    12. Relay_Master_Log_File: mysql-bin.000001
    13. Slave_IO_Running: Yes --------主要看俩个IO线程是否成功启动
    14. Slave_SQL_Running: Yes --------看SQL线程是否成功启动
    15. Replicate_Do_DB:
    16. Replicate_Ignore_DB:
    17. Replicate_Do_Table:
    18. Replicate_Ignore_Table:

    4.测试主从复制

    1. 主库!
    2. mysql> show databases;
    3. +--------------------+
    4. | Database |
    5. +--------------------+
    6. | information_schema |
    7. | company |
    8. | db1 |
    9. | mysql |
    10. | performance_schema |
    11. | school |
    12. | sys |
    13. | xian |
    14. +--------------------+
    15. 8 rows in set (0.00 sec)
    16. 从库:
    17. mysql> show databases;
    18. +--------------------+
    19. | Database |
    20. +--------------------+
    21. | information_schema |
    22. | mysql |
    23. | performance_schema |
    24. | sys |
    25. | xian |
    26. +--------------------+
    27. 5 rows in set (0.00 sec)

    这是因为配置主从复制是在主库已经存在这些库以后配置的

    1. !!!!在主库创建库,创建表,写入数据
    2. mysql> create database db2;
    3. mysql> create table db2.zhucong(id int,name varchar(50),age int);
    4. mysql> insert into zhucong(id,name,age) values(1,'aaa',18),
    5. values(2,'bbb',19) ,(3,'ccc',20);
    6. mysql> select * from zhucong;
    7. +------+------+------+
    8. | id | name | age |
    9. +------+------+------+
    10. | 1 | aaa | 18 |
    11. | 2 | bbb | 19 |
    12. | 3 | ccc | 20 |
    13. +------+------+------+
    14. 3 rows in set (0.00 sec)
    15. !!!在从库查看
    16. mysql> show databases;
    17. +--------------------+
    18. | Database |
    19. +--------------------+
    20. | information_schema |
    21. | db2 |
    22. | mysql |
    23. | performance_schema |
    24. | sys |
    25. | xian |
    26. +--------------------+
    27. mysql> use db2;
    28. Reading table information for completion of table and column names
    29. You can turn off this feature to get a quicker startup with -A
    30. Database changed
    31. mysql> show tables;
    32. +---------------+
    33. | Tables_in_db2 |
    34. +---------------+
    35. | zhucong |
    36. +---------------+
    37. 1 row in set (0.00 sec)
    38. mysql> select * from zhucong;
    39. +------+------+------+
    40. | id | name | age |
    41. +------+------+------+
    42. | 1 | aaa | 18 |
    43. | 2 | bbb | 19 |
    44. | 3 | ccc | 20 |
    45. +------+------+------+

    修改主库中的表数据,查看从库是否有变化

    1. 主库:
    2. mysql> update zhucong set age=21;
    3. Query OK, 3 rows affected (0.00 sec)
    4. Rows matched: 3 Changed: 3 Warnings: 0
    5. mysql> select * from zhucong;
    6. +------+------+------+
    7. | id | name | age |
    8. +------+------+------+
    9. | 1 | aaa | 21 |
    10. | 2 | bbb | 21 |
    11. | 3 | ccc | 21 |
    12. +------+------+------+
    13. 3 rows in set (0.00 sec)
    14. 查看从库:
    15. mysql> select * from zhucong;
    16. +------+------+------+
    17. | id | name | age |
    18. +------+------+------+
    19. | 1 | aaa | 21 |
    20. | 2 | bbb | 21 |
    21. | 3 | ccc | 21 |
    22. +------+------+------+
    23. 3 rows in set (0.00 sec)

    配置好主从复制以后,从库记录的只是主库以后的日志文件,要想从库备份主库之前的可以,先将主库之前的数据库文件备份然后拷贝到从库,然后从库在进行恢复即可。

    当从库所在的服务器关闭后,主库所执行操作,当从库服务器再次开启时,从库服务器会自动同步主库服务器

    附加:

    获取本机的uuid

    1. [root@slave ~]# uuidgen
    2. b392cd4c-9e3d-4596-9a72-0805c2162c8f

    修改本机的uuid

    #  vim /var/lib/mysql/auto.cnf

    base64加密与解密

    1. [root@slave mysql]# echo “马龙” | base64
    2. 4oCc6ams6b6Z4oCdCg==
    3. [root@slave mysql]# echo "4oCc6ams6b6Z4oCdCg==" | base64 -d
    4. “马龙”

  • 相关阅读:
    GLSL (2)数据类型
    k8s教程(13)-pod定向调度
    C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗
    高等教育学:学生与教师
    PAT乙级 1070 结绳 python
    元器件降额设计标准与要点参考总结
    hive从入门到放弃(一)——初识hive
    给电脑一键重装系统后找回照片查看器的方法
    Java 8 引进的一个新特性 Optional
    springboot265基于Spring Boot的库存管理系统
  • 原文地址:https://blog.csdn.net/m0_59933574/article/details/133516113