首页 > 代码库 > MySQL主从复制

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,或者某张表。
 
1, 关闭master数据库,编辑master的/usr/my.cnf,my.ini,增加配置:
[mysqld]log-bin=mysql-binserver-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
重启mysql
 
2, 关闭slave数据库,编辑slave的my.ini,增加配置
[mysqld]server-id=2
重启mysql
 
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;
 
8, 启动slave线程
mysql> START SLAVE;
 
9, 当你不想replication了,可以在slave上停止slave线程
mysql> STOP SLAVE;
停止后你也可以重新start slave,replication机制会自动将这段时间master上的数据更新同步到slave。
 
10, 思考:
在项目中我们可以利用replication实现数据库读写分离,从而提升服务器性能。master数据库用于写,slave数据库用于读。
http://dev.mysql.com/doc/connector-j/en/connector-j-master-slave-replication-connection.html
 
11, 参考资料:
http://dev.mysql.com/doc/refman/5.6/en/replication.html
 
12, 

MySQL主从复制