MySQL主从复制的原理及配置方法
作者:yishouwangnian的博客 发布时间:[ 2016/10/24 10:00:35 ] 推荐标签:数据库 MySQL
如果你忘记设置主服务器的server-id值,从服务器不能连接主服务器。
注释:为了保证事务InnoDB复制设置的大可能的耐受性和一致性,
应在主服务器的my.cnf文件中使用innodb_flush_log_at_trx_commit=1和sync-binlog=1。
mysql> show variables; (检查是否read-only,该选项令slave除了slave线程或者拥有SUPER权限用户之外的都不能更新数据,确保slave不会接受来自其他客户端的更新。)
mysql> show processlist; (检查是否slave-start)
在启动mysql的同时启动slave:
mysqld_safe –user=mysql –read-only & (启动MySQL服务器,同时启动slave的I/O线程)
mysql> SHOW SLAVE STATUSG;
5.切换slave为master,在slave上:
mysql> STOP SLAVE;
mysql> RESET MASTER;
五.复制启动选项
–read_only
该选项让从服务器只允许来自从服务器线程或具有SUPER权限的用户的更新。可以确保从服务器不接受来自客户的更新。
–replicate_do_db=db_name
告诉从服务器只做默认数据库(由USE所选择)为db_name的语句的复制。要指定多个数据库,应多次使用该选项,每个数据库使用一次。请注意不复制跨数据库的语句
–replicate_do_table=db_name.tbl_name
告诉从服务器线程只做对指定表的复制。要指定多个表,应多次使用该选项,每个表使用一次。同–replicate-do-db对比,允许跨数据库更新。
–replicate_ignore_db=db_name
告诉从服务器不要复制默认数据库(由USE所选择)为db_name的语句。要想忽略多个数据库,应多次使用该选项,每个数据库使用一次。
–replicate-ignore-table=db_name.tbl_name
告诉从服务器线程不要复制更新指定表的任何语句(即使该语句可能更新其它的表)。要想忽略多个表,应多次使用该选项,每个表使用一次。
–replicate_wild_do_table=db_name.tbl_name
告诉从服务器线程限制复制更新的表匹配指定的数据库和表名模式的语句。模式可以包含‘%’和‘_’通配符,与LIKE模式匹配操作符具有相同的含义。要指定多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。
–replicate_wild_ignore_table=db_name.tbl_name
告诉从服务器线程不要复制表匹配给出的通配符模式的语句。要想忽略多个表,应多次使用该选项,每个表使用一次。该选项可以跨数据库进行更新。
–replicate_rewrite_db=from_name->to_name
告诉从服务器如果默认数据库(由USE所选择)为主服务器上的from_name,则翻译为to_name。只影响含有表的语句
–report_host=slave_name
从服务器注册过程中报告给主服务器的主机名或IP地址。该值出现在主服务器上SHOW SLAVE HOSTS的输出中。如果不想让从服务器自己在主服务器上注册,则不设置该值。
–report_port=slave_port
连接从服务器的TCP/IP端口号,从服务器注册过程中报告给主服务器。
–skip_slave_start
告诉从服务器当服务器启动时不启动从服务器线程。使用START SLAVE语句在以后启动线程。
–slave_skip_errors=[err_code1,err_code2,… | all]
通常情况,当出现错误时复制停止,这样给你一个机会手动解决数据中的不一致性问题。该选项告诉从服务器SQL线程当语句返回任何选项值中所列的错误时继续复制。
例如:
–slave-skip-errors=1062,1053
–slave-skip-errors=all
六、不停机配置复制的方法
方法一:
如果你在某时间点做过主服务器备份并且记录了相应快照的二进制日志名和偏移量(通过SHOW MASTER STATUS命令的输出),采用下面的步骤:
确保从服务器分配了一个的服务器ID号。 将备份文件拷到从服务器上。 在从服务器上执行下面的语句,为每个选项填入适当的值:
mysql> CHANGE MASTER TO
-> MASTER_HOST=’master_host_name’,
-> MASTER_USER=’master_user_name’,
-> MASTER_PASSWORD=’master_pass’,
-> MASTER_LOG_FILE=’recorded_log_file_name’,
-> MASTER_LOG_POS=recorded_log_position;
4.在从服务器上执行START SLAVE语句。
如果你没有备份主服务器,这里是一个创建备份的快速程序。所有步骤都应该在主服务器主机上执行。
发出该语句:
mysql> FLUSH TABLES WITH READ LOCK; 仍然加锁时,执行该命令(或它的变体):
shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql
并拷到从服务器上。 发出该语句并且确保记录了以后用到的输出:
mysql>SHOW MASTER STATUS; 释放锁:
mysql> UNLOCK TABLES;
方法二:
一个可选择的方法是,转储主服务器的SQL来代替前面步骤中的二进制复制。要这样做,你可以在主服务器上使用mysqldump –master-data,以后装载SQL转储到到你的从服务器。然而,这比进行二进制复制速度慢。
七、其他
1.不能从使用新二进制日志格式的主服务器向使用旧二进制日志格式的从服务器复制。
2.升级从服务器时,应先关闭从服务器,升级到相应5.1.x版本,然后重启从服务器并重新开始复制。5.1版本的从服务器能够读取升级前写入的旧的中继日志并执行日志中包含的语句。升级后从服务器创建的中继日志为5.1格式。
3.必须在主服务器和从服务器上总是使用相同的全局字符集和校对规则(–default-character-set、–default- collation)。否则,会在从服务器上遇到复制键值错误,因为在主服务器的字符集中被认为是的键值在从服务器的字符集中可能不是的。
4.Q:从服务器需要始终连接到主服务器吗?
A:不,不需要。从服务器可以宕机或断开连接几个小时甚至几天,重新连接后获得更新信息。
5.Q:我怎样知道从服务器与主服务器的新比较? 换句话说,我怎样知道从服务器复制的后一个查询的日期?
A:你可以查看SHOW SLAVE STATUS语句的Seconds_Behind_Master列的结果。
Q:我怎样强制主服务器阻塞更新直到从服务器同步?
A:使用下面的步骤: 在主服务器上,执行这些语句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
记录SHOW语句的输出的日志名和偏移量。这些是复制坐标。
2.在从服务器上,发出下面的语句,其中Master_POS_WAIT()函数的参量是前面步骤中的得到的复制坐标值:
mysql> SELECT MASTER_POS_WAIT(‘log_name’, log_offset);
SELECT语句阻塞直到从服务器达到指定的日志文件和偏移量。此时,从服务器与主服务器同步,语句返回。
3.在主服务器上,发出下面的语句允许主服务器重新开始处理更新:
mysql> UNLOCK TABLES;
7.Q:怎样通过复制来提高系统的性能?
A:你应将一个服务器设置为主服务器并且将所有写指向该服务器。然后根据预算配置尽可能多的从服务器以及栈空间,并且在主服务器和从服务器之间分发读取操作。你也可以用–skip-innodb、–skip-bdb、–low-priority-updates以及–delay-key- write=ALL选项启动从服务器,以便在从服务器端提高速度。在这种情况下,为了提高速度,从服务器使用非事务MyISAM表来代替InnoDB和 BDB表。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南