官方中文文档: http://dev.mysql.com/doc/refman/5.1/zh/replication.html
原理: MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上)。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
1.master :
确保主服务器主机上my.cnf文件的[mysqld]部分包括一个log-bin选项。该部分还应有一个server-id=Master_id选项,其中master_id必须为1到232–1之间的一个正整数值。例如:
[mysqld]
log-bin=mysql-bin
server-id=103
binlog-do-db=bigman
binlog_format=row
#根据需要自行选择复制模式,ROW/STATEMENT/MIXED(行复制、语句复制、混合复制http://dev.mysql.com/doc/refman/5.1/en/replication-formats.html)
sync_binlog=1
#Sync_binlog=0,这意味着当事务提交之后,mysql不做fsync(文件系统同步)之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。sync_binlog=n,当每进行n次提交之后,mysql将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。Sync_binlog=0是数据库默认设置,性能也是最好的,也是最危险的。一旦系统crash,在binlog_cache中的所有binlog信息都会被丢失。当synn_binlog=1的时候,是最安全性能消耗也最大,完成一个事务,同步一次。系统crash了,也只是丢掉了未完成的事务信息。没做过这方面的测试,设置为1和0在性能方面的差距,有做过的说在高并发系统中,两种设置性能可高达5倍甚至更多。(参考http://www.2cto.com/database/201208/145892.html)
2.slave : 停止slave mysql,并在其my.cnf文件中添加下面的行:[mysqld]
server-id=104
binlog_format=row
log-bin=srv104.mysql-bin
#slave机器没必要一定开启binlog
log_slave_updates=1
#log_slave_updates 链式复制需要设置这个选项,开启binlog并设置了该选项的mysql可以同时当slave和master,从前一个master复制数据并作为master往后一个slave复制数据
relay_log=mysql104-relay-bin
skip_slave_start
#skip_slave_start 启动mysql的同时不启动从master的复制
replicate-wild-ignore-table=tfengyun.t_user_followers_ids
replicate-wild-ignore-table=tfengyun.tmp_user_followers_ids
3.master : GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.22.0.102' IDENTIFIED BY 'xxxx';
FLUSH TABLES WITH READ LOCK; #把数据写盘并加锁,防止mysql数据文件和binlog文件继续被修改
4.master : 对主服务器上的数据进行快照,最简单的途径是使用归档程序对主服务器上的数据目录中的数据库进行二进制备份.
tar -cvf /tmp/mysql-snapshot.tar ./this_db
如果从服务器的用户账户与主服务器的不同,你可能不想复制mysql数据库。在这种情况下,应从归档中排除该数据库。
你也不需要在归档中包括任何日志文件或者master.info或relay-log.info文件。
5.slave : 到mysql数据目录下,tar -xvf /tmp/mysql-snapshot.tar
6.master : 当FLUSH TABLES WITH READ LOCK所置读锁定有效时,读取主服务器上当前的二进制日志名和偏移量值:
mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73 | bigman | |
+---------------+----------+--------------+------------------+
File列显示日志名,而Position显示偏移量。在该例子中,二进制日志值为mysql-bin.003,偏移量为73。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,从服务器应从该点开始从主服务器上进行新的更新。
取得快照并记录日志名和偏移量后,可以在主服务器上重新启用写活动:
mysql> UNLOCK TABLES;
7.slave :
启动从服务器。如果前面已经复制了,用--skip-slave-start选项启动从服务器,以便它不立即尝试连接主服务器。你也可能想要用--logs-warnings选项启动从服务器(默认设置启用),以便在错误日志中显示更多的问题相关的信息(例如,网络或连接问题)。放弃的连接将记入错误日志,除非其值大于1。
8.slave :
在从服务器上执行下面的语句,用你的系统的实际值替换选项值:
mysql> CHANGE MASTER TO MASTER_HOST='172.22.0.xx', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='xxxxx', MASTER_LOG_FILE='myql-bin.003', MASTER_LOG_POS=73;
mysql> START SLAVE; #master不需要这些命令,只要开启了binlog日志就行了,slave连上去的时候master会自动启master线程响应数据复制
PS:
从服务器复制时,会在其数据目录中发现文件master.info和relay-log.info。从服务器使用这两个文件跟踪已经处理了多少主服务器的二进制日志。不要移除或编辑这些文件,除非你确切知你正在做什么并完全理解其意义。即使这样,最好是使用CHANGE MASTER TO语句。
master.info的内容会覆盖命令行或in my.cnf中指定的部分选项。
为了保证事务InnoDB复制设置的最大可能的耐受性和一致性,应在主服务器的my.cnf文件中使用innodb_flush_log_at_trx_commit=1和sync-binlog=1。