mysql主从复制
Posted 年岁有加,并非垂老
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql主从复制相关的知识,希望对你有一定的参考价值。
mysql主从复制的原理
Master,记录数据更改操作
启用binlog记录模式
允许Slave读取binlog日志
Slave运行两个同步线程
Slave_IO:负责连接Master,复制其binlog日志文件到本机的relay-log文件
Slave_SQL:负责执行本机relay-log文件里的SQL语句,重现Master的数据操作
基本构建思路
初始化现有库
将主库倒入重库,确保数据一致性
配置Master,主服务器
调整运行参数,授权一个同步用户
配置Slave,从服务器
调整运行参数,发起同步操作
一:初始化现有库
1)备份MySQL Master上现有的库,如果服务器已经启用binlog,建议对日志做一次重置,否则可忽略:
[[email protected] ~]# mysql -u root -p Enter password: //以数据库用户root登入 .. .. mysql> RESET MASTER; //重置binlog日志 Query OK, 0 rows affected (0.07 sec) mysql> quit //退出mysql> 环境 Bye
以备份mysql库、test库为例,导出操作如下:
[[email protected] ~]# mysqldump -u root -p -B mysql test > /root/mytest.sql Enter password: //验证口令 [[email protected] ~]# ls -lh /root/mytest.sql //确认备份结果 -rw-r--r--. 1 root root 457K 1月 18 11:50 /root/mytest.sql
2)在MySQL Slave上导入备份的库
先清理目标库,避免导入时冲突。主要是采用InnoDB引擎的库,授权库mysql多采用MyISAM引擎,可不做清理。
[[email protected] ~]# mysql -u root -p Enter password: //以数据库用户root登入 .. .. mysql> DROP DATABASE test; //删除test库 Query OK, 0 rows affected (0.03 sec) mysql> quit //退出mysql> 环境 Bye
使用scp工具下载备份文件:
[[email protected] ~]# scp dbsvr1:/root/mytest.sql ./ [email protected]‘s password: //验证对方系统用户root的口令 mytest.sql 100% 577KB 576.6KB/s 00:01 [[email protected] ~]# ls -lh mytest.sql //确认下载结果 -rw-r--r--. 1 root root 457K 1月 16 12:00 mytest.sql
执行导入操作:
[[email protected] ~]# mysql -u root -p < mytest.sql Enter password:
二:配置MySQL Master
1)修改/etc/my.cnf配置,重新启动MySQL服务程序,指定服务器ID号、允许日志同步:
[[email protected] mysql]# vim /etc/my.cnf [mysqld] log_bin=dbsvr1-bin //启用binlog日志,并指定文件名前缀 server_id = 10 //指定服务器ID号 innodb_flush_log_at_trx_commit=1 //优化设置 sync-binlog=1 //允许日志同步 .. .. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES explicit_defaults_for_timestamp=1 [[email protected] ~]# service mysqld restart
2)新建一个备份用户,授予复制权限
需要的权限为REPLICATION SLAVE,允许其从Slave服务器访问:
REPLICATION SLAVE 常用于建立复制时所需要用到的用户权限,也就是slave server必须被master server授权具有该权限的用户,才能通过该用户复制。
并且"SHOW SLAVE HOSTS"这条命令和REPLICATION SLAVE权限有关,否则执行时会报错:
REPLICATION CLIENT 不可用于建立复制,有该权限时,只是多了可以使用如"SHOW SLAVE STATUS"、"SHOW MASTER STATUS"等命令。
在5.6.6版本以后,也可以使用"SHOW BINARY LOGS"。
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘replicater‘@‘192.168.10.%‘ IDENTIFIED BY ‘pwd123‘; Query OK, 0 rows affected (0.03 sec)
3)检查Master服务器的同步状态
在已经初始化现有库的情况下,查看MASTER状态,记录下当前的日志文件名、偏移的位置(下面SLAVE发起复制时需要用到):
mysql> SHOW MASTER STATUSG *************************** 1. row *************************** File: dbsvr1-bin.000002 //记住当前的日志文件名 Position: 334 //记住当前的位置 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.03 sec)
三:配置MySQL Slave(从服务器)
1)修改/etc/my.cnf配置,重新启动MySQL服务程序
指定服务器ID号、允许日志同步:
[[email protected] ~]# vim /etc/my.cnf [mysqld] log_bin=dbsvr2-bin //启动SQL日志,并指定文件名前缀 server_id = 20 //指定服务器ID号,不要与Master的相同 innodb_flush_log_at_trx_commit=1 //优化设置 sync-binlog=1 //允许日志同步 log_slave_updates=1 //记录从库更新,便于实现“主-从-从”链式复制 .. .. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES explicit_defaults_for_timestamp=1
在生产环境中,还可以根据需要设置更详细的同步选项。比如,指定当主、从网络中断时的重试超时时间(slave-net-timeout=60 )等,具体可参考MySQL手册。
配置完成后,重启mysql服务:
2)登入 mysql> 环境,发起同步操作
通过CHANGE MASTER语句指定MASTER服务器的IP地址、同步用户名/密码、起始日志文件、偏移位置(参考MASTER上的状态输出):
mysql> CHANGE MASTER TO MASTER_HOST=‘192.168.10.10‘, -> MASTER_USER=‘replicater‘, -> MASTER_PASSWORD=‘pwd123‘, -> MASTER_LOG_FILE=‘dbsvr1-bin.000002‘, //对应Master的日志文件 -> MASTER_LOG_POS=334; //对应Master的日志偏移位置 Query OK, 0 rows affected, 2 warnings (0.12 sec)
然后执行START SLAVE(较早版本中为SLAVE START)启动复制:
mysql> START SLAVE; //启动复制 Query OK, 0 rows affected (0.04 sec
注意:一旦启用SLAVE复制,当需要修改MASTER信息时,应先执行STOP SLAVE停止复制,然后重新修改、启动复制。
通过上述连接操作,MASTER服务器的设置信息自动存为master.info文件,以后每次MySQL服务程序时会自动调用并更新,无需重复设置。查看master.info文件的开头部分内容,可验证相关设置:
3)检查Slave服务器的同步状态
通过SHOW SLAVE STATUS语句可查看从服务器状态,确认其中的IO线程、SQL线程正常运行,才能成功同步:
mysql> SHOW SLAVE STATUSG *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.4.10 Master_User: replicater Master_Port: 3306 Connect_Retry: 60 Master_Log_File: dbsvr1-bin.000002 Read_Master_Log_Pos: 334 Relay_Log_File: dbsvr2-relay-bin.000002 Relay_Log_Pos: 284 Relay_Master_Log_File: dbsvr1-bin.000002 Slave_IO_Running: Yes //IO线程应该已运行 Slave_SQL_Running: Yes //SQL线程应该已运行 .......... .........
若START SLAVE直接报错失败,请检查CHANGE MASTER相关设置是否有误,纠正后再重试;若IO线程或SQL线程有一个为“No”,则应检查服务器的错误日志,分析并排除故障后重启主从复制。
四:测试主从同步效果
1)在Master上操作数据库、表、表记录
新建newdb库、newtable表,随意插入几条表记录,然后在slave上查看是否同步到相应的数据
........
.........
五:将Slave服务器设为只读
一般来说,为了避免写入冲突,采用主、从复制结构时,不应该允许用户从Slave执行数据库写入操作,这样会导致双方数据的不一致性。
正因为如此,我们可以把Slave数据库限制为只读模式,这种情况下有SUPER权限的用户和SLAVE同步线程才能写入。相关验证操作及效果可参考以下过程。
1)修改/etc/my.cnf文件,重载配置
[[email protected] ~]# vim /etc/my.cnf [mysqld] .. .. read_only=1 //启动只读模式 [[email protected] ~]# service mysqld restart //重启服务 Shutting down MySQL.. [确定] Starting MySQL... [确定]
以上是关于mysql主从复制的主要内容,如果未能解决你的问题,请参考以下文章