https://www.cnblogs.com/gl-developer/p/6170423.html
主从
环境说明:
Master:192.168.0.103
Slave:192.168.0.105
MySQL 的 Master 配置:
这里列出主要的主从配置my.ini:
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306
server-id=103
log-bin=mysql-bin
expire_logs_days = 7 // 表示日志保留7天,超过7天则设置为过期的
# binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW
# 减少记录日志的内容,只记录受影响的列
binlog_row_image = minimal
# 指定需要复制的数据库名为db_test
# 如果备份多个数据库,重复设置这个选项即可
binlog-do-db = data
binlog-do-db = nacos
binlog-do-db = zc_manager
binlog-do-db = zc_order
binlog-do-db = zc_security
# 不需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可(未测试)
# binlog-ignore-db=mysql2
# 这个参数要加上,否则不会给更新的记录些到二进制文件里(未测试)
# log-slave-updates=1
# 跳过错误,继续执行复制操作(可选)
slave-skip-errors=all #跳过所有错误
#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
#具体的错误代码表现如下:
#1007:数据库已存在,创建数据库失败
#1008:数据库不存在,删除数据库失败
#1050:数据表已存在,创建数据表失败
#1050:数据表不存在,删除数据表失败
#1054:字段不存在,或程序文件跟数据库有冲突
#1060:字段重复,导致无法插入
#1061:重复键名
#1068:定义了多个主键
#1094:位置线程ID
#1146:数据表缺失,请恢复数据库
*配置好后,重启Master 的 MySQL服务!!!
//--------------------------------------------------
MySQL 的 Slave 配置:
配置my.ini:
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306
server-id = 105
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
*配置好后,重启Slave 的 MySQL服务!!!
//--------------------------------------------------
登录master 给同步用户授权
GRANT REPLICATION SLAVE,replication client on *.* to 'root'@'%' identified by 'Root@123';
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by'123456';
show master status;
登录Slave,然后执行下面命令:
# slave 启动的需要先停止
mysql> stop slave;
mysql> change master to
master_host='192.168.0.103',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=154,master_port=3357;
mysql> start slave;
mysql> show slave status;
查看这两项是否为YES,yes为正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
问题1 Slave_IO_Running No
发生原因是用docker搭建数据库,复制文件搭建了从库,导致UUIDs一样
show slave status时发现,那个表有一个单元格有错误的log信息,我就拷贝出来看了:
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
these UUIDs must be different for replication to work.
原来是我们两台主从服务器的UUIDs是相同的,然后分别去看看两台服务器的/var/lib/mysql/auto.cnf
果然UUIDs是相同的,随便改变一个数据库的UUIDs的数值,然后重启数据库问题解决
2 清理日志
数据库同步一段时间后bin文件不断变多变大,需要磁盘空间不大需要
show binary logs;
show variables like '%log%';
set global expire_logs_days = 7;
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-12-19 21:00:00';
# 确认全部日志同步完成的也可以执行重置
reset master;
问题 3 mysql 1872
因: 启动slave时,使用repository中信息初始化relay log结构失败了,由于我使用的是冷备份文件恢复的实例,在mysql库中的slave_relay_log_info表中依然保留之前relay_log的信息,所以导致启动slave报错
master info log:该文件保存slave连接master的状态以及配置信息,如用户名,密码,日志执行的位置等。在5.6版本之前,都是使用master.info文件,从5.6开始,通过在my.cnf 中配置 --master-info-repository=TABLE。这些信息会被写入mysql.slave_master_info 表中,代替原来的master.info文件了。
relay log info log:该文件保存slave上relay log的执行位置。在5.6版本之前,都是使用relay-log.info文件,从5.6开始,通过在my.cnf中配置 --relay-log-info-repository=TABLE,使用mysql.slave_relay_log_info表代替原来的文件。每次当slave上执行start slave时,就会读取该表中的位置信息。
不要试图手工的更新、插入、删除以上两个表的内容,以免出现意料不到的问题,使用reset slave
5.6 后 relay-log 改成Table记录了
#master status and connection information输出到表mysql.slave_master_info中
master_info_repository = TABLE
#the slave‘s position in the relay logs输出到表mysql.slave_relay_log_info中
relay_log_info_repository = TABLE
## relay_log配置中继日志
#relay-log=/var/lib/mysql/msql-relay-bin
#relay-log-index=/var/lib/mysql/msql-relay-bin-index
问题 4 mysql 1794
问题出现的原因是因为mysql 版本 不同导致 5.6和5.7, 5.7 版本中的主从信息记录的是在表中 也就是上面说的配置到表中
第一步查看docker配置的conf位置是否正确,我第一次配置就没配对路径导致一个是Table,一个是FILE
第二步 查看配置的信息是不是表,确认两个数据版本是同一个,
show variables like '%repository%';
问题 5、 数据库同步失效的解决
当数据同步进程失效后,首先手工检查slave主机当前备份的数据库日志文件在master主机上是否存在,在slave主机上运行:
MySQL> show slave status\G
一般获得如下的信息:
*************************** 1\. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.18.3.3
Master_User: tongbu
Master_Port: 3306
Connect_Retry: 30
Master_Log_File: MySQL-bin.000001
Read_Master_Log_Pos: 360
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 497
Relay_Master_Log_File: MySQL-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: bak
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 360
Relay_Log_Space: 497
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
其中Master_Log_File描述的是master主机上的日志文件。
在master上检查当前的数据库列表:
MySQL> show master logs;
得到的日志列表如下:
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| localhost-bin.000001 | 495 |
| localhost-bin.000002 | 3394 |
+----------------------+-----------+
如果slave主机上使用的的Master_Log_File对应的文件在master的日志列表中存在,在slave主机上开启从属服务器线程后可以自动同步:
MySQL> start slave;
如果master主机上的日志文件已经不存在,则需要首先从master主机上恢复全部数据,再开启同步机制。
在slave主机上运行:
MySQL> stop slave;
在master主机上运行:
MySQL> stop slave;
在slave主机上运行:
MySQL> load data from master;
MySQL> reset master;
MySQL> start slave;
在master主机上运行:
MySQL> reset master;
MySQL>start slave;
注意:LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的数据库上有效。
问题 6 故障现象:
进入slave服务器,运行:
mysql> show slave status\G
.......
Relay_Log_File: localhost-relay-bin.000535
Relay_Log_Pos: 21795072
Relay_Master_Log_File: localhost-bin.000094
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
......
解决办法一、
Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的. 一般是事务回滚造成的: 解决办法: .
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
解决办法二、
首先停掉Slave服务:slave stop 到主服务器上查看主机状态: 记录File和Position对应的值
进入master
mysql> show master status;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| localhost-bin.000094 | 33622483 | | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后到slave服务器上执行手动同步:
mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3306,
> master_log_file=localhost-bin.000094',
> master_log_pos=33622483 ;
1 row in set (0.00 sec)
mysql> slave start;
1 row in set (0.00 sec)
mysql> show slave status\G
*************************** 1\. row ***************************
........
Master_Log_File: localhost-bin.000094
Read_Master_Log_Pos: 33768775
Relay_Log_File: localhost-relay-bin.000537
Relay_Log_Pos: 1094034
Relay_Master_Log_File: localhost-bin.000094
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
手动同步需要停止master的写操作!
问题 7 "Slave_IO_Running: No" MYSQL不同步
"Slave_IO_Running: No"MYSQL不同步 今天发现Mysql不同步,show slave status查看同步状态如下: Slave_IO_Running: No
Slave_SQL_Running: Yes 使用start slave也不能同步。后来,先stop slave 再reset slave再start slave就正常了。
问题8 主从数据库同步延时问题
https://www.cnblogs.com/qinyujie/p/8891775.html
mysql 主从复制默认使用单线程的,下面开个多线程.
show variables like '%slave_parallel%';
STOP SLAVE SQL_THREAD;
SET GLOBAL slave_parallel_type='LOGICAL_CLOCK';
# 修改工作线程数
SET GLOBAL slave_parallel_workers=16;
START SLAVE SQL_THREAD;
show variables like '%slave_parallel%';
show processlist;
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_transactions%';
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'WHERE NAME = 'transaction';
# 用视图查看线程的使用情况
use `data`;
CREATE VIEW rep_thread_count AS SELECT a.THREAD_ID AS THREAD_ID,a.COUNT_STAR AS COUNT_STAR FROM performance_schema.events_transactions_summary_by_thread_by_event_name a WHERE a.THREAD_ID in (SELECT b.THREAD_ID FROM performance_schema.replication_applier_status_by_worker b);
SELECT SUM(COUNT_STAR) FROM rep_thread_count INTO @total;
SELECT 100*(COUNT_STAR/@total) AS thread_usage FROM rep_thread_count;
# 同步的时间修改
SET GLOBAL binlog_group_commit_sync_delay = 1000000;
# 高并发时 达到20 没有达到 1秒也提交
SET GLOBAL binlog_group_commit_sync_no_delay_count = 20;
修改mysql 考虑使用半同步,mysql默认是异步的,半同步保证至少一个从库同步事务.
问题9 Mysql replication error 1594(从库relaylog损坏)
show slave status\G;
找到 Relay_Master_Log_File
和 Exec_Master_Log_Pos
使用reset slave;
清理掉之前的relaylog,
从之前执行到的位置开始同步。
stop slave;
reset slave;
change master to master_host='192.168.0.103',master_user='backup',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=1111111,master_port=3357;
start slave;
点波关注 系统搭建(docker)