MySQL主从配置:介绍,配置主数据库master,配置从数据库slave,同步参数配置,测试主从同步,修复错误
MySQL主从介绍
配置主数据库master
编辑配置文件my.cnf
vim /etc/my.cnf
在basedir和datadir下增加:
server-id=128
log_bin=test1
保存退出
重启mysqld服务
systemctl restart mysqld
查看datadir目录下是否有以test1开头的文件
[[email protected] ~]# ls -lt /data/mysql/
total 110756
-rw-rw---- 1 mysql mysql 50331648 Jul 2 18:41 ib_logfile0
-rw-rw---- 1 mysql mysql 12582912 Jul 2 18:41 ibdata1
-rw-rw---- 1 mysql mysql 126231 Jul 2 18:41 test1.err
-rw-rw---- 1 mysql mysql 5 Jul 2 18:41 test1.pid
-rw-rw---- 1 mysql mysql 16 Jul 2 18:41 test1.index 索引文件
-rw-rw---- 1 mysql mysql 120 Jul 2 18:41 test1.000001 二进制的logbin文件,同步过程中还有多个这样的文件,相当于文件队列。
drwx------ 2 mysql mysql 4096 Jul 1 23:10 zrlog
drwx------ 2 mysql mysql 4096 Jun 21 15:35 mysql
-rw-rw---- 1 mysql mysql 56 Jun 10 18:55 auto.cnf
drwx------ 2 mysql mysql 4096 Jun 10 17:19 performance_schema
-rw-rw---- 1 mysql mysql 50331648 Jun 10 17:19 ib_logfile1
drwx------ 2 mysql mysql 4096 Jun 10 17:02 test
备份zrlog库,作为要备份的数据,(****=password)
mysqldump -u root -p**** zrlog > /tmp/zrlog.sql
创建同步用户,并授予replication slave权限,指定密码
grant replication slave on *.* to 'repl'@'slave_ip' identified by 'password';
锁表,禁止写入
flush tables with read lock;
查看主数据库当前状态,并记住File和Position对应的内容,从数据库上要用到
show master status;
配置从数据库slave
编辑配置文件my.cnf
vim /etc/my.cnf
在basedir和datadir下增加:
server-id=129 不能跟主数据库一样
保存退出
重启mysqld服务
systemctl restart mysqld
将主数据库备份的zrlog.sql文件拷贝到从数据库
scp -P port [email protected]_ip:/tmp/zrlog.sql /tmp/
在从数据库里创建zrlog库,并将zrlog.sql恢复到zrlog库里
/usr/local/mysql/bin/mysql -u root
create database zrlog;
show databases;
quit;
/usr/local/mysql/bin/mysql zrlog < /tmp/zrlog.sql
配置从数据库从属slave:
mysql -uroot 进入库
stop slave; 停止从属
change master to master_host='', master_port=3306, master_user='repl', master_password='', master_log_file='', master_log_pos=xxx; 配置从属参数
start slave; 启动从属
注意:master_port和master_log_pos后面不能有单引号,会报语法错误,master_password中若密码有特殊符号,也不需要用双引号。
在主数据库上解表:
mysql -u root -p
unlock tables;
在从数据库上查看slave是否正常:
mysql -uroot
show slave status\G
查看:
Slave_IO_Running: Yes 备份线程是否正常(传输binlog生成relaylog)
Slave_SQL_Running: Yes 操作线程是否正常(执行relaylog里的sql语句)
Seconds_Behind_Master: 0 主从延迟时间
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
注意防火墙打开主数据库监听的端口,默认3306
同步参数配置:
主数据库上的配置选项:
binlog-do-db= 仅同步指定的库,多个用半角逗号 , 分隔
binlog-ignore-db= 忽略指定库,多个用半角逗号 , 分隔
从数据库上的配置选项:
replicate_do_db= 仅同步指定的库 ,多个用半角逗号 , 分隔
replicate_ignore_db= 忽略制定库,多个用半角逗号 , 分隔
replicate_do_table= 仅同步指定的表,多个用半角逗号 , 分隔
replicate_ignore_table= 忽略指定的表,多个用半角逗号 , 分隔
replicate_wild_do_table= 仅同步指定库里指定的表(*.*),支持支持通配符%,如test.%
replicate_wild_ignore_table= 忽略指定库里指定的表(*.*),支持支持通配符%,如test.%
测试主从同步
主: select count(*) from db;
从: select count(*) from db;
主: truncate table db;
从: select count(*) from db;
主: drop table db;
从: show table db;
修复错误:
如果在从数据库上误删了库或表,导致主从同步报错, Slave_SQL_Running: No 。
解决办法:重新配置从属
1、stop slave; 停止从属
2、change master to master_host='', master_port=3306, master_user='repl', master_password='', master_log_file='', master_log_pos=xxx;
3、start slave; 启动从属