主库配置
my.cnf文件
binlog-do-db = 数据库名 (你要备份的数据库)
binlog-ignore-db = 数据库名 (你不需要备份的数据库)
如果没有在/etc/my.cnf添加以上2个参数,那就是说明备份所有数据库
其它可以选择添加
# 主从同步模式
binlog_format = row
# 开启gtid模式
gtid_mode=on
# 保证GTID安全的参数
enforce_gtid_consistency=on
# 让从机接收到bin_log后也同步到自己的bin_log上
log-slave-updates=1
确保/etc/mysql/my.cnf 中有如下参数,一般情况下都是都有的,但是以确保实验的成功率还是检查一下比较好。
假如没有如下参数,自己手动添加,并重启mysql服务器
[mysqld]
log-bin=mysql-bin (启动二进制文件)
server-id=1 (服务器ID)
主主复制加入下面内容:(主主复制就是两个主从复制相互执行,a主b从,b主a从)
auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL
登录mysql(master)服务器,添加一个叫做slave的用户,并授权给从服务器
登录mysql数据库的命令(mysql8不一样如下:)
CREATE USER 'slave'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
重启mysql服务器 systemctl restart mysql
登录数据库
输入SHOW MASTER STATUS;获取FILE和POS的
从库配置
修改配置文件my.cnf
binlog-do-db = 数据库名 (你要备份的数据库)
binlog-ignore-db = 数据库名 (你不需要备份的数据库)
如果没有在/etc/my.cnf添加以上2个参数,那就是说明备份所有数据库
(1) 确保/etc/mysql/my.cnf 中有如下参数,一般情况下都是都有的,但是以确保实验的成功率还是检查一下比较好。假如没有如下参数,自己手动添加,并重启mysql服务器
[mysqld]
log-bin=mysql2-bin (启动二进制文件)
server-id=2 (服务器ID需要不一样,唯一)
重启mysql服务器 systemctl restart mysql
登录mysql服务器:输入以下命令
CHANGE MASTER TO MASTER_HOST='10.9.11.5',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='5-bin.000001',
MASTER_LOG_POS=157;
CHANGE MASTER TO MASTER_HOST='10.9.11.5', # 主库IP
MASTER_PORT=3306, # 端口
MASTER_USER='slave', # 用户
MASTER_PASSWORD='123456', # 密码
MASTER_LOG_FILE='5-bin.000001', # 主库输入SHOW MASTER STATUS;命令查看
MASTER_LOG_POS=157; # 主库输入SHOW MASTER STATUS;命令查看
启动slave同步:start slave;
检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。
命令是:show slave status\G
主服务器进程查看:
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
(2)在从服务器上查看
mysql > show slave status\G
问题原因在于:发现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
解决办法如下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 ;