【4.7.2】服务器安装 Docker中安装与配置 Mysql 主从配置

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_FileExec_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)

你可能感兴趣的:(【4.7.2】服务器安装 Docker中安装与配置 Mysql 主从配置)