Linux环境下Mysql数据库主从同步配置文档
序言
一直想把最近自己所有学到的东西整理出来,现在终于不算忙了。整理完Redis的文档顺便就整理整理最近学习Mysql的一些经验,目前我的Mysql等级还在地下室呢,就只能拿出之前学到的主从同步配置来分享一下。下一阶段mysql的目标是学习查询优化。
背景
Java后端免不了要使用到数据库。经验都是从实践中得来的,参照项目组中的大神的文档学习。也是碰到了几次好机会,果断主动申请处理,亲自动手了操作了几次完美收官终于学会了。要不怎么说“实践是检验真理的唯一标准”呢,已经成功很多次了,请大家放心食用。
一、已有数据复制
我一直是使用mysqldump来copy数据的,但是要是数据量比较大的话,导出sql文件就会又费时又大,传到丛库也就比较慢。数据库中数据导出命令如下:
①数据导出命令:导出某个数据库中某个表的表结构以及数据:
- mysqldump -h Ip地址 -u 用户名 -p 数据库名 表名 > 输出path/文件名.sql
②数据导出命令:导出某个数据库中某个表的表结构:
-
mysqldump -h Ip地址 -u 用户名 -p -d 数据库名 表名 > 输出path/文件名.sql
③数据导出命令:如果还有其他要就在命令行中添加参数,删除已经存在的表:
- mysqldump -u root -p'big(*)guo' --disable-keys --max_allowed_packet=67108864 --net_buffer_length=32768 --complete-insert --single-transaction --quick --no-autocommit --default-character-set=utf8 --master-data=2 db_guo tb_temp > /home/bigguo/tb_temp.sql
④数据导出命令:不删除表,插入时收忽略错误
-
mysqldump -u root -p'big(*)guo' --disable-keys --max_allowed_packet=67108864 --net_buffer_length=32768 --complete-insert --single-transaction --quick --no-autocommit --default-character-set=utf8 --no-create-info --skip-add-drop-table --insert-ignore --skip-triggers --skip-add-locks test_guo tb_temp > /home/bigguo/tb_temp.sql
⑤数据导入命令:
- mysql -h localhost -u'用户名' -p"密码" 数据库 < /home/lgl/xxxx.sql
二、主从数据库文件配置设置
①主库:/etc/my.cnf配置主要属性
- server-id = 1001 #主库节点,注意:需要和从库不相同,推荐融合ip地址保证唯一
- binlog-ignore-db = mysql #日志文件,忽略哪些库,mysql
- binlog-ignore-db = information_schema #日志文件,忽略哪些库,information_schema
- replicate-ignore-db = mysql #数据库同步,忽略哪些库,mysql
- replicate-ignore-db = information_schema #数据库同步,忽略哪些库,information_schema
- log-slave-updates = 1 #表示slave将复制事件写进自己的二进制日志,供slave调用
- binlog_format = row #binlog日志格式,仅记录哪条数据被修改,修改成什么样,按行记录
- binlog-do-db = 数据库名 #重点!!!,指定mysql的binlog日志记录哪个db。没有binlog日志无法同步,同步是通过binlog日志同步的。
- sync_binlog = 0
- auto_increment_offset = 1
- auto_increment_increment = 1
- slave-skip-errors = all
②从库:/etc/my.cnf配置主要属性
- server-id = 1002 #从库节点,注意:需要和主库不相同,推荐融合ip地址保证唯一
- binlog-ignore-db = mysql #日志文件,忽略哪些库,mysql
- binlog-ignore-db = information_schema #日志文件,忽略哪些库,information_schema
- replicate-ignore-db = mysql #数据库同步,忽略哪些库,mysql
- replicate-ignore-db = information_schema #数据库同步,忽略哪些库,information_schema
-
log-slave-updates = 1 #表示slave将复制事件写进自己的二进制日志:当设置log_slave_updates时,你可以让slave扮演其它slave的master。此时,slave把SQL线程执行的事件写进行自己的二进制日志(binary log),然后,它的slave可以获取这些事件并执行它。
- binlog_format = row #binlog日志格式,仅记录哪条数据被修改,修改成什么样,按行记录
- sync_binlog = 0
- log_bin = mysql-bin #日志文件,如果该slave为其他库的master,则必须要有这行命令
- auto_increment_offset = 1
- auto_increment_increment = 1
- slave-skip-errors = all
- relay-log-index = /data/mysqldata/slave-relay-bin.index
- relay-log = /data/mysqldata/relay-log #中继日志
#丛库独有
- replicate-do-db = mysql #同步整个数据库命令,即同步名为mysql的数据库
- replicate-do-table = 数据库名.表名 #同步表命令,即同步数据库下的指定表
- replicate-ignore-db = mysql #忽略同步整个数据库命令,即忽略同步名为mysql的数据库
注:binlog_format=row是按行同步能够在一定范围内减少同步失败的可能性,如果按sql同步的话出现一次错误以后的数据就都会有问题。
③其他属性说明:
- read_only = 1 #注意:只读。防止改变数据,只读
- slave_skip_errors = ? #选项有四个可用值,分别为:off/all/ErorCode/ddl_exist_errors,默认off
- sync_binlog =(1 or N) #如果开启此选项,MySQL每次提交事务之前会将二进制同步到磁盘上,保证服务器崩溃时不会丢失事件。如果禁用此选项,服务器会少做一些工作,但二进制日志文件可能在服务器崩溃时损坏或丢失信息。如果备库不是那么重要,那么开启会带来额外的开销,它只适用于二进制日志,而非中继日志。
- auto_increment_offset #表示自增长字段从哪个数开始,指字段一次递增多少,取值范围是1 -65535。
- auto_increment_increment #表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1-65535。为了避免两台服务器同时做更新时自增长字段的值之间发生冲突。一般在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,而要把auto_increment_offset分别配置为1和2。
注:上述配置信息需要重启数据库才能生效,最重要的如下:
- 同步表命令: replicate-do-table = zmail_ur.zm_group_to_accredit
- 忽略数据库命令: replicate-ignore-db = mysql
- binlog日志同步格式: binlog_format = row
- binlog日志记录数据库: binlog-do-db = 数据库名
三、数据库同步操作过程
①在master上创建用于主从复制的帐号:
grant replication slave on *.* to 'bigguo01'@'11.22.33.%' identified by '1234abc';
- grant:是授权命令,表示见权限 on 数据库对象 to 某账户
- bigguo01: 表示用户名
- 11.22.33.44 :该账号允许访问的ip,也可以使用ip字段可以使用%,%表示任意值
- 1234abc :表示密码
② 账号立即生效命令:
flush privileges;
③将master数据copy到丛库中
④查询主库存储信息,配置丛库slave命令:
1、主库运行:show master status;
结果显示:
File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------------+-----------------+-----------------------+-------------------------+
| mysql-bin.000456 | 2208509929 | |
2、丛库运行:
①停止slave:stop slave;
②配置主从信息:change master to master_host='主库ip',master_user='copy专用账号',master_password='密码',master_log_file='mysql-bin.000456',master_log_pos=2208509929;
#如果主库、用户、密码不变,可以直接执行 : change master to master_log_file='mysql-bin.000456',master_log_pos=2208509929;
③启动slave:start slave;
④验证主从信息:show slave status \G
若结果显示中 Slave_IO_Running和Slave_SQL_Running两项都为yes则成功,否则需要根据提示修改问题。