mysql主从同步简单配置
2016-03-15 19:00
447 查看
配置MySQL Master(主服务器,192.168.4.10)1)修改/etc/my.cnf配置,重新启动MySQL服务程序指定服务器ID号、允许日志同步:[root@dbsvr1 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
重启mysql服务:
[root@dbsvr1 ~]# service mysql restart
2)新建一个备份用户,授予复制权限需要的权限为REPLICATION SLAVE,允许其从Slave服务器访问:mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicater'@'192.168.4.%' IDENTIFIED BY 'pwd123';
3)检查Master服务器的同步状态在已经初始化现有库的情况下,查看MASTER状态,记录下当前的日志文件名、偏移的位置(下面SLAVE发起复制时需要用到):mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: dbsvr1-bin.000002 //记住当前的日志文件名
Position: 334 //记住当前的位置
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.04 sec)
步骤三:配置MySQL Slave(从服务器,192.168.4.20)1)修改/etc/my.cnf配置,重新启动MySQL服务程序指定服务器ID号、允许日志同步:[root@dbsvr2 ~]# 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服务:[root@dbsvr2 ~]# service mysql restart
2)登入 mysql> 环境,发起同步操作通过CHANGE MASTER语句指定MASTER服务器的IP地址、同步用户名/密码、起始日志文件、偏移位置(参考MASTER上的状态输出):mysql> CHANGE MASTER TO MASTER_HOST='192.168.4.10',
-> MASTER_USER='replicater',
-> MASTER_PASSWORD='pwd123',
-> MASTER_LOG_FILE='dbsvr1-bin.000002', //对应Master的日志文件
-> MASTER_LOG_POS=334; //对应Master的日志偏移位置
然后执行START SLAVE(较早版本中为SLAVE START)启动复制:
mysql> START SLAVE; //启动复制
注意:一旦启用SLAVE复制,当需要修改MASTER信息时,应先执行STOP SLAVE停止复制,然后重新修改、启动复制。通过上述连接操作,MASTER服务器的设置信息自动存为master.info文件,以后每次MySQL服务程序时会自动调用并更新,无需重复设置。查看master.info文件的开头部分内容,可验证相关设置:3)检查Slave服务器的同步状态通过SHOW SLAVE STATUS语句可查看从服务器状态,确认其中的IO线程、SQL线程正常运行,才能成功同步:mysql> SHOW SLAVE STATUS\G
*************************** 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线程应该已运行
Replicate_Do_DB:
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: 334
Relay_Log_Space: 458
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_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
Master_UUID: e9f37060-6baf-11e3-8112-000c29aa7715
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.06 sec)
若START SLAVE直接报错失败,请检查CHANGE MASTER相关设置是否有误,纠正后再重试;若IO线程或SQL线程有一个为“No”,则应检查服务器的错误日志,分析并排除故障后重启主从复制。步骤四:测试主从同步效果1)在Master上操作数据库、表、表记录新建newdb库、newtable表,随意插入几条表记录:mysql> CREATE DATABASE newdb; //新建库newdb
Query OK, 1 row affected (0.04 sec)
mysql> USE newdb; //切换到newdb库
Database changed
mysql> CREATE TABLE newtable(id int(4)); //新建newtable表
Query OK, 0 rows affected (0.14 sec)
mysql> INSERT INTO newtable VALUES(1234),(5678); //插入2条表记录
Query OK, 2 rows affected (0.05 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM newtable; //确认表数据
+------+
| id |
+------+
| 1234 |
| 5678 |
+------+
2 rows in set (0.00 sec)
2)在Slave上确认自动同步的结果直接切换到newdb库,并查询newtable表的记录,应该与Master上的一样,这才说明主从同步已经成功生效:mysql> USE newdb; //直接切换到newdb库
mysql> SELECT * FROM newtable; //输出表记录
3)在Master服务器上可查看Slave主机的信息
mysql> SHOW SLAVE HOSTS;
步骤五:将Slave服务器设为只读一般来说,为了避免写入冲突,采用主、从复制结构时,不应该允许用户从Slave执行数据库写入操作,这样会导致双方数据的不一致性。正因为如此,我们可以把Slave数据库限制为只读模式,这种情况下有SUPER权限的用户和SLAVE同步线程才能写入。相关验证操作及效果可参考以下过程。1)新建一个测试用户rwuser(不能用root测试)在Master上建立即可,会自动同步到Slave上:mysql> GRANT all ON newdb.* TO rwuser@localhost IDENTIFIED BY '1234567';
2)未启用只读前,验证从Slave写入在Slave上以rwuser登入(不要用root哦):[root@dbsvr2 ~]# mysql -u rwuser -p
然后向newdb库中新建一个booker表:
mysql> USE newdb; //切换到newdb库
mysql> CREATE TABLE booker(id int(12)); //成功创建booker表
在Slave上可看到新建的booker表:
mysql> SHOW TABLES;
但是在Master上却看不到,导致主、从上的newdb出现不一致:
mysql> USE newdb;
mysql> SHOW TABLES; //看不到Slave上新建的表
完成上述验证后,在Slave上删除booker表,确保双方一致:
mysql> DROP TABLE booker;
3)修改/etc/my.cnf文件,重载配置
4)再次在Slave上验证数据库写入操作仍然是以rwuser登入(不要用root哦)来验证,当尝试创建新表时会被拒绝:mysql> USE newdb; //切换到newdb库
mysql> CREATE TABLE booker(id int(12)); //新建表的写入操作失败
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
mysql> DROP TABLE mytable; //删除表的写入操作一样会失败
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
[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
重启mysql服务:
[root@dbsvr1 ~]# service mysql restart
2)新建一个备份用户,授予复制权限需要的权限为REPLICATION SLAVE,允许其从Slave服务器访问:mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicater'@'192.168.4.%' IDENTIFIED BY 'pwd123';
3)检查Master服务器的同步状态在已经初始化现有库的情况下,查看MASTER状态,记录下当前的日志文件名、偏移的位置(下面SLAVE发起复制时需要用到):mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: dbsvr1-bin.000002 //记住当前的日志文件名
Position: 334 //记住当前的位置
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.04 sec)
步骤三:配置MySQL Slave(从服务器,192.168.4.20)1)修改/etc/my.cnf配置,重新启动MySQL服务程序指定服务器ID号、允许日志同步:[root@dbsvr2 ~]# 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服务:[root@dbsvr2 ~]# service mysql restart
2)登入 mysql> 环境,发起同步操作通过CHANGE MASTER语句指定MASTER服务器的IP地址、同步用户名/密码、起始日志文件、偏移位置(参考MASTER上的状态输出):mysql> CHANGE MASTER TO MASTER_HOST='192.168.4.10',
-> MASTER_USER='replicater',
-> MASTER_PASSWORD='pwd123',
-> MASTER_LOG_FILE='dbsvr1-bin.000002', //对应Master的日志文件
-> MASTER_LOG_POS=334; //对应Master的日志偏移位置
然后执行START SLAVE(较早版本中为SLAVE START)启动复制:
mysql> START SLAVE; //启动复制
注意:一旦启用SLAVE复制,当需要修改MASTER信息时,应先执行STOP SLAVE停止复制,然后重新修改、启动复制。通过上述连接操作,MASTER服务器的设置信息自动存为master.info文件,以后每次MySQL服务程序时会自动调用并更新,无需重复设置。查看master.info文件的开头部分内容,可验证相关设置:3)检查Slave服务器的同步状态通过SHOW SLAVE STATUS语句可查看从服务器状态,确认其中的IO线程、SQL线程正常运行,才能成功同步:mysql> SHOW SLAVE STATUS\G
*************************** 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线程应该已运行
Replicate_Do_DB:
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: 334
Relay_Log_Space: 458
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_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
Master_UUID: e9f37060-6baf-11e3-8112-000c29aa7715
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.06 sec)
若START SLAVE直接报错失败,请检查CHANGE MASTER相关设置是否有误,纠正后再重试;若IO线程或SQL线程有一个为“No”,则应检查服务器的错误日志,分析并排除故障后重启主从复制。步骤四:测试主从同步效果1)在Master上操作数据库、表、表记录新建newdb库、newtable表,随意插入几条表记录:mysql> CREATE DATABASE newdb; //新建库newdb
Query OK, 1 row affected (0.04 sec)
mysql> USE newdb; //切换到newdb库
Database changed
mysql> CREATE TABLE newtable(id int(4)); //新建newtable表
Query OK, 0 rows affected (0.14 sec)
mysql> INSERT INTO newtable VALUES(1234),(5678); //插入2条表记录
Query OK, 2 rows affected (0.05 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM newtable; //确认表数据
+------+
| id |
+------+
| 1234 |
| 5678 |
+------+
2 rows in set (0.00 sec)
2)在Slave上确认自动同步的结果直接切换到newdb库,并查询newtable表的记录,应该与Master上的一样,这才说明主从同步已经成功生效:mysql> USE newdb; //直接切换到newdb库
mysql> SELECT * FROM newtable; //输出表记录
3)在Master服务器上可查看Slave主机的信息
mysql> SHOW SLAVE HOSTS;
步骤五:将Slave服务器设为只读一般来说,为了避免写入冲突,采用主、从复制结构时,不应该允许用户从Slave执行数据库写入操作,这样会导致双方数据的不一致性。正因为如此,我们可以把Slave数据库限制为只读模式,这种情况下有SUPER权限的用户和SLAVE同步线程才能写入。相关验证操作及效果可参考以下过程。1)新建一个测试用户rwuser(不能用root测试)在Master上建立即可,会自动同步到Slave上:mysql> GRANT all ON newdb.* TO rwuser@localhost IDENTIFIED BY '1234567';
2)未启用只读前,验证从Slave写入在Slave上以rwuser登入(不要用root哦):[root@dbsvr2 ~]# mysql -u rwuser -p
然后向newdb库中新建一个booker表:
mysql> USE newdb; //切换到newdb库
mysql> CREATE TABLE booker(id int(12)); //成功创建booker表
在Slave上可看到新建的booker表:
mysql> SHOW TABLES;
但是在Master上却看不到,导致主、从上的newdb出现不一致:
mysql> USE newdb;
mysql> SHOW TABLES; //看不到Slave上新建的表
完成上述验证后,在Slave上删除booker表,确保双方一致:
mysql> DROP TABLE booker;
3)修改/etc/my.cnf文件,重载配置
4)再次在Slave上验证数据库写入操作仍然是以rwuser登入(不要用root哦)来验证,当尝试创建新表时会被拒绝:mysql> USE newdb; //切换到newdb库
mysql> CREATE TABLE booker(id int(12)); //新建表的写入操作失败
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
mysql> DROP TABLE mytable; //删除表的写入操作一样会失败
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复