数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

MYSQL数据库主主同步实战


发布日期:2020年04月01日
 
MYSQL数据库主主同步实战

MYSQL支持单向异步复制复制过程中一个服务器充当主服务器而一个或多个其它服务器充当从服务器主服务器将更新写入二进制日志文件并维护日志文件的一个索引以跟蹤日志循环当一个从服务器连接到主服务器时它通知主服务器从服务器在日志中读取的最后一次成功更新的位置从服务器接收从那时起发生的任何更新然后封锁并等待主服务器通知下一次更新

在实际项目中两台分布于异地的主机上安装有MYSQL数据库两台服务器互为主备客户要求当其中一台机器出现故障时另外一台能够接管服务器上的应用这就需要两台数据库的数据要实时保持一致在这里使用MYSQL的同步功能实现双机的同步复制

以下是操作实例

数据库同步设置

主机操作系统RedHat Enterprise Linux

数据库版本mysql Ver Distrib

前提MYSQL数据库正常启动

假设两台主机地址分别为

ServA

ServB

配置同步账号

在ServA上增加一个ServB可以登录的帐号

Mysql>GRANT all privileges ON ** TO tongbu@ IDENTIFIED BY ;

在ServB上增加一个ServA可以登录的帐号

Mysql>GRANT all privileges ON ** TO tongbu@ IDENTIFIED BY ;

配置数据库参数

以root用户登录ServA修改ServA的f文件

vi /etc/f

在[mysqld]的配置项中增加如下配置

defaultcharacterset=utf

logbin=mysqlbin

relaylog=relaybin

relaylogindex=relaybinindex

serverid=

masterhost=

masteruser=tongbu

masterpassword=

masterport=

masterconnectretry=

binlogdodb=umsdb

replicatedodb=umsdb

replicateignoretable=umsdbboco_tb_menu

replicateignoretable=umsdbboco_tb_connect_log

replicateignoretable=umsdbboco_tb_data_stat

replicateignoretable=umsdbboco_tb_log_record

replicateignoretable=umsdbboco_tb_workorder_record

以root用户登录ServB修改ServB的f文件

vi /etc/f

在[mysqld]的配置项中增加如下配置

defaultcharacterset=utf

logbin=mysqlbin

relaylog=relaybin

relaylogindex=relaybinindex

serverid=

masterhost=

masteruser=tongbu

masterpassword=

masterport=

masterconnectretry=

binlogdodb=umsdb

replicatedodb=umsdb

replicateignoretable=umsdbboco_tb_menu

replicateignoretable=umsdbboco_tb_connect_log

replicateignoretable=umsdbboco_tb_data_stat

replicateignoretable=umsdbboco_tb_log_record

replicateignoretable=umsdbboco_tb_workorder_record

手工执行数据库同步

假设以ServA为主服务器在ServB上重启mysql

service mysqld restart

在ServB上用root用户登录mysql执行

Mysql> stop slave;

Mysql> load data from master;

Mysql> start slave;

在ServA上重启mysql

service mysqld restart

查看数据库同步状态

在mysql命令提示符下执行

Mysql> show slave status\G

将显示同步进程的状态如下所示两行蓝色字体为slave进程状态如果都为yes表示正常;红色字体表示同步错误指示如果有问题会有错误提示

*************************** row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host:

Master_User: tongbu

Master_Port:

Connect_Retry:

Master_Log_File: localhostbin

Read_Master_Log_Pos:

Relay_Log_File: localhostrelaybin

Relay_Log_Pos:

Relay_Master_Log_File: localhostbin

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB: bakumsdb

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table: umsdbboco_tb_connect_logumsdbboco_tb_menuumsdbboco_tb_workorder_recordumsdbboco_tb_data_statumsdbboco_tb_log_record

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:

Last_Error:

Skip_Counter:

Exec_Master_Log_Pos:

Relay_Log_Space:

Until_Condition: None

Until_Log_File:

Until_Log_Pos:

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master:

数据库同步测试

配置完数据库后进行测试首先在网络正常情况下测试在ServA上进行数据库操作和在ServB上进行数据库操作数据都能够同步过去

拔掉ServB主机上的网线然后在ServA上做一些数据库操作之后再恢复ServB的网络环境但是在ServB上却看不到同步的数据通过命令show slave status\G查看发现Slave_IO_Running的状态是No这种状态持续很长一段时间数据才能同步到ServB上去这是什么问题呢?同步延迟不会这么大吧后来通过网上查找相关资料找到一个同步延迟相关的参数

slavenettimeout=seconds

参数含义当slave从主数据库读取log数据失败后等待多久重新建立连接并获取数据

于是在配置文件中增加该参数设置为

slavenettimeout=

重启MYSQL数据库后测试该问题解决

数据库同步失效的解决

当数据同步进程失效后首先手工检查slave主机当前备份的数据库日志文件在master主机上是否存在在slave主机上运行

mysql> show slave status\G

一般获得如下的信息

*************************** row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host:

Master_User: tongbu

Master_Port:

Connect_Retry:

Master_Log_File: mysqlbin

Read_Master_Log_Pos:

Relay_Log_File: localhostrelaybin

Relay_Log_Pos:

Relay_Master_Log_File: mysqlbin

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:

Last_Error:

Skip_Counter:

Exec_Master_Log_Pos:

Relay_Log_Space:

Until_Condition: None

Until_Log_File:

Until_Log_Pos:

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master:

其中Master_Log_File描述的是master主机上的日志文件

在master上检查当前的数据库列表

mysql> show master logs;

得到的日志列表如下

+++

| Log_name | File_size |

+++

| localhostbin | |

| localhostbin | |

+++

如果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 slave;

mysql>start slave;

注意LOAD DATA FROM MASTER目前只在所有表使用MyISAM存储引擎的数据库上有效

               

上一篇:重置MySQL数据库密码的实际操作流程

下一篇:数据库人员手边系列:Mysql字段长度