目录
A: 测试环境
B 主库操作
C:从库操作
D:主从同步问题总结
问题一: Slave_SQL_Running_State: Reading event from the relay log 出现延迟
问题二:Last_SQL_Error: Could not execute Delete_rows event
主服务器: window系统
主库(master):masterhost|masterport|masteruser|masterpassword
mysql:5.7.17 community server
从服务器: linux系统
从库(slave): slavehost|slaveport|slaveuser|slavepassword
mysql:5.7.22 community server
登录数据库
主库:mysql -u masteruser -p --port masterport
从库 mysql -h slavehost -u slaveuser-p --port slaveport
退出数据库
exit
文件路径:D:\mysql\my.ini (注:window 文件为my.ini, linux 文件为/etc/my.cnf)
文件内容解释:
server-id = 1 这是数据库ID,此ID唯一,主库用默认的1即可,从库调整为2,多个从库的ID依次类推,切不可有相同ID出现,这样会造成同步出错
log_bin=mysql-bin 二进制日志文件,此项必须启用,从库需要通过它进行数据同步。
binlog_do_db=bigdata 需要同步的数据库,如果同步多个库,需要另行重写,
文件配置为:
# Binary Logging.
log_bin=mysql-bin
binlog_do_db=bigdata
binlog_do_db=coins
# Server Id.
server-id=1
Cmd-> services.msc ->mysql restart
grant replication slave on *.* to 'slave_account'@'%' identified by '123456';
5.1 确保window和linux数据库字符集相同,避免主从同步错误
Mysql> show create database coins\G;
show variables like ‘%char%’;
Show variables like ‘%collation%’;
5.2 备份主库数据库
主库mysql\bin文件夹处,管理员权限执行命令,
mysqldump -u root -p --port 8806 bigdata > D:\bigdata.sql
mysqldump -u root -p --port 8806 coins > D:\coins.sql
5.3 将数据从window拷贝到Linux中。
Linux文件目录 /data/datafiles/
5.4登录Linux的MySql数据库
mysql -u root -p --port 8806
5.5创建与windows同名的数据库名
Mysql> show databases;
Create database coins;
5.6导入数据
Use coins;
Source /data/datafiles/coins.sql
另一个数据库bigdata同样操作。
文件路径: /etc/my.cnf
文件添加内容:
server-id=2
Service mysqld restart
与主库进行同步,可将下面内容调整好后直接复制到mysql命令行下,这样不容易出错
设置连接MASTER MASTER_LOG_FILE为主库的File,MASTER_LOG_POS为主库的Position,就是在主库记录的那2个值
Mysql>change master to
master_host = 'masterhost ',
master_user='slave_account',
master_password='123456',
master_port=masterport,
master_log_file='mysql-bin.000001',
master_log_pos=16882020;
Start slave;
当Slave_IO_Running 和 Slave_SQL_Running 两列的值都为 "Yes",表明 Slave 的 I/O 和 SQL 线程都在正常运行,如果出现错误,可以从Last_Error这个参数中看出哪里出错,然后进行排查。
查找问题:
第一步:进入mysql
mysql> show slave status \G # 查看同步状态
Slave_SQL_Running_State: Reading event from the relay log 出现延迟
第二步:查看日志:
方法一:根据中继日志文件与位置点分析relaylog
show relaylog events in 'i-2f725c20-relay-bin.000025’ from 283059259 limit 50 ;
方法二:查看主库日志
/usr/bin/mysqlbinlog -v --base64-output=DECODE-ROWS /data/datafiles/mysql-bin.000012 | grep -A 500 407189557
第三步:这个位置点开始是对一个百万级表的update操作,而这个update操作是个全表扫描。表上没主键和索引。
解决办法:
第一步:mysql>stop slave;
第二步:给从库相应表加上相关的索引
第三步:mysql > start slave ;
第四步: mysql > show slave status \G
Exec_Master_Log_Pos开始变化,Seconds_Behind_Master也在逐渐减小。成功解决问题。
Last_SQL_Error: Could not execute Delete_rows event on table coins.upbit_hq_log; Can't find record in 'upbit_hq_log', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.000004, end_log_pos 4151275
查找问题:
/usr/bin/mysqlbinlog -v --base64-output=DECODE-ROWS /data/datafiles/mysql-bin.000004 | grep -A 500 4151275
发现删除的记录在从库不存在。
解决办法:
进入mysql后
mysql>stop slave;
set global sql_slave_skip_counter=1 ;
start slave;
show slave status \G;