MySQL主从复制
测试环境:
master: CentOS 6.6 (x86_64), MySQL5.6.22
slave: Windows 8(x86_64), MySQL5.6.19
相关名词:主从复制,读写分离,数据备份
Replication允许将master数据库的数据复制到多个slave数据库上,replication默认是异步的,因此slave不需要永久的连接到master,slave可以不在线,一旦slave在线后,会把master最新的数据增量同步下来,replication允许复制整个database,或者某个database,或者某张表。
[mysqld] log-bin=mysql-bin server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
重启mysql
master配置参数
2, 关闭slave数据库,编辑slave的my.ini,增加配置
[mysqld] server-id=2
#下面4行表示:将slave配置成其它slave的master
#log-bin=mysql-bin
#innodb_flush_log_at_trx_commit=1
#sync_binlog=1
#log_slave_updates=1 #slave将复制事件写入自己的bin-log,这样slave作为master的时候,其它slave就可以根据这些bin-log进行复制
#replicate-ignore-db=test #不要复制test数据库
#replicate-rewrite-db=db_name_a->db_name_b #在master上针对数据库db_name_a中表的操作会被映射到slave的db_name_b数据库中的相应表。
重启mysql
slave配置参数
注:--replicate-rewrite-db: Only statements involving tables are affected (not statements such as
CREATE DATABASE
, DROP DATABASE
, and ALTER DATABASE
)3, 在master上创建replication帐号
mysql>CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';
mysql> FLUSH PRIVILEGES;
4, 获取master数据库binary log的名称和位置
打开第一个master session将数据库锁定,只允许读操作
mysql> FLUSH TABLES WITH READ LOCK;
打开另一个master session, 查看binary log的name、position
mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
如果你的master数据库之前没有使用binary log,这时候你看到的name和postion是空的,则在后面的操作中name='',position=4
如果你的数据库已经有数据了,需要在replication之前就导入到slave中,请保持master读锁,使用mysqldump将master的数据导出来并导入到slave数据库中。具体请参考第5步。
如果你的数据库之前没有数据,或者你不想要之前的数据了,则可以释放master锁,有2种方式释放:
1)直接退出第一个session
2)执行:
mysql> UNLOCK TABLES;
然后跳到第7节
5, 在master上使用mysqldump创建数据快照
说明:此节的目的是,如果master在replication之前已经有数据了,则需要在replication之前将这些数据从master数据库中导出,然后导入到slave数据库;这个操作完成之后就可以replication了;如果你的master之前没有数据,则跳过此节。
在master机器的shell上,执行以下命令,将整个db导出到dbdump.db文件中。(加上--master-data则在导出时先锁定表,然后再导数据,最后释放锁)-uroot -p参数可选,是指定master数据库帐号密码用的
shell> mysqldump -uroot -p --all-databases --master-data > dbdump.db
6, 将数据导入到slave数据库
-uroot -p参数可选,是指定slave数据库帐号密码用的
shell> mysql -uroot -p < dbdump.db
7, 在slave上设置master数据库连接信息
mysql>CHANGE MASTER TO
->MASTER_HOST='
->master_host_name
',MASTER_USER='
->replication_user_name
',MASTER_PASSWORD='
->replication_password
',MASTER_LOG_FILE='
->recorded_log_file_name
',MASTER_LOG_POS=
recorded_log_position
;
注:重复设定之前需要执行:
mysql> RESET SLAVE;
8, 启动slave线程
mysql> START SLAVE;
9, 当你不想replication了,可以在slave上停止slave线程
mysql> STOP SLAVE;
停止后你也可以重新start slave,replication机制会自动将这段时间master上的数据更新同步到slave。
10, 思考:
在项目中我们可以利用replication实现数据库读写分离,从而提升服务器性能。master数据库用于写,slave数据库用于读。
11, 参考资料:
12,