主库配置

my.cnf文件

  1. binlog-do-db = 数据库名 (你要备份的数据库)
  2. binlog-ignore-db = 数据库名 (你不需要备份的数据库)
  3. 如果没有在/etc/my.cnf添加以上2个参数,那就是说明备份所有数据库
  4. 其它可以选择添加
  5. # 主从同步模式
  6. binlog_format = row
  7. # 开启gtid模式
  8. gtid_mode=on
  9. # 保证GTID安全的参数
  10. enforce_gtid_consistency=on
  11. # 让从机接收到bin_log后也同步到自己的bin_log上
  12. log-slave-updates=1
  13. 确保/etc/mysql/my.cnf 中有如下参数,一般情况下都是都有的,但是以确保实验的成功率还是检查一下比较好。
  14. 假如没有如下参数,自己手动添加,并重启mysql服务器
  15. [mysqld]
  16. log-bin=mysql-bin (启动二进制文件)
  17. server-id=1 (服务器ID
  18. 主主复制加入下面内容:(主主复制就是两个主从复制相互执行,ab从,ba从)
  19. auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n
  20. auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL

登录mysql(master)服务器,添加一个叫做slave的用户,并授权给从服务器
登录mysql数据库的命令(mysql8不一样如下:)

  1. CREATE USER 'slave'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';
  2. GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';

重启mysql服务器 systemctl restart mysql
登录数据库
输入SHOW MASTER STATUS;获取FILE和POS的
image.png

从库配置

修改配置文件my.cnf

  1. binlog-do-db = 数据库名 (你要备份的数据库)
  2. binlog-ignore-db = 数据库名 (你不需要备份的数据库)
  3. 如果没有在/etc/my.cnf添加以上2个参数,那就是说明备份所有数据库
  4. 1 确保/etc/mysql/my.cnf 中有如下参数,一般情况下都是都有的,但是以确保实验的成功率还是检查一下比较好。假如没有如下参数,自己手动添加,并重启mysql服务器
  5. [mysqld]
  6. log-bin=mysql2-bin (启动二进制文件)
  7. server-id=2 (服务器ID需要不一样,唯一)

重启mysql服务器 systemctl restart mysql
登录mysql服务器:输入以下命令

  1. CHANGE MASTER TO MASTER_HOST='10.9.11.5',
  2. MASTER_PORT=3306,
  3. MASTER_USER='slave',
  4. MASTER_PASSWORD='123456',
  5. MASTER_LOG_FILE='5-bin.000001',
  6. MASTER_LOG_POS=157;
  7. CHANGE MASTER TO MASTER_HOST='10.9.11.5', # 主库IP
  8. MASTER_PORT=3306, # 端口
  9. MASTER_USER='slave', # 用户
  10. MASTER_PASSWORD='123456', # 密码
  11. MASTER_LOG_FILE='5-bin.000001', # 主库输入SHOW MASTER STATUS;命令查看
  12. MASTER_LOG_POS=157; # 主库输入SHOW MASTER STATUS;命令查看

启动slave同步:start slave;

检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。
命令是:show slave status\G
image.png

主服务器进程查看:
show processlist;
从服务器进程查看:
show processlist;

问题排查
Slave_IO_Running: NO
这是一个很常见的错误,总结起来就三个原因:

主服务器的网络不通,或者主服务器的防火墙拒绝了外部连接3306端口
在配置从服务器时,输错了ip地址和密码,或者主服务器在创建用户时写错了用户名和密码
在配置从服务器时,输错了主服务器的二进制日志信息
排错过程:(主服务器ip:192.168.67.140,从服务器ip:192.168.67.130)

第0步就是检查错误日志,如果不能快速排错,可以按我的步骤试试:
1.首先在从服务器上执行ping程序,确定能ping通主服务器
在从服务器上执行mysq的远程连接
mysql -urep -p -h 192.168.67.140 -P3306
如果显示ERROR 1045 (28000): Access denied for user ‘test’@’192.168.67.130’ (using password: YES)

2.登陆主服务器的mysql,查看所有的用户
mysql > select user,host from mysql.user;
看看用户名是否写错,假如用户名写错了,先删除错误的用户(如用户名为test@192.168.67.%)
mysql > drop user “test@192.168.67.%”@”%”;

再重新创建用户
mysql > grant replication slave on . to ‘rep’@‘192.168.67.%’ identified by ‘123456’;
mysql > flush privileges;

案例分析
(1)查看主服务器
mysql > show master status\G
image.png

(2)在从服务器上查看
mysql > show slave status\G
image.png
问题原因在于:发现Master_Log_File没有对应
在出现Slave_IO_Running:No的机器上进行如下操作
mysql > slave stop;
mysql >CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000026’, MASTER_LOG_POS=0;
mysql > slave start;
mysql > show slave status\G

Slave_SQL_Running: No

解决办法如下1:
mysql > stop slave;
mysql > SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql > start slave;
mysql > show slave status\G

image.png
解决办法如下2:手动修改跳过错误,(数据库的内容保持需要一致,备份主库数据的从库)
stop slave;
reset slave;
CHANGE MASTER TO MASTER_HOST=’10.9.11.5’,MASTER_PORT=3306,MASTER_USER=’slave’,MASTER_PASSWORD=’123456’,master_log_file=’5-bin.000006’,master_log_pos=65552340;
start slave;
show slave status\G

全局读锁定:
FLUSH TABLES WITH READ LOCK ;
执行了命令之后所有库所有表都被锁定只读,一般用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。
解锁:
UNLOCK TABLES ;