MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上)。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。
设置主从复制:
1、确保在主服务器和从服务器上安装的MySQL版本相同。
2、确保主服务器开启log-bin,(最好手工指定二进制日志名)主从服务器还应有不同的server-id。
2、在主服务器上为复制设置一个连接账户。
- GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'replication'@'%' IDENTIFIED BY 'slavepass';
3、在主服务器上,执行FLUSH TABLES WITH READ LOCK锁表并导出一份需要做主从库的数据,(导出数据可以通过mysqldump,tar等方法)。
4、当FLUSH TABLES WITH READ LOCK所设置读锁定有效时(即mysql客户端程序不退出),并读取主服务器上当前的二进制日志名和偏移量值。
- mysql > SHOW MASTER STATUS;
- +-------------------+----------+-------------------+------------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +-------------------+----------+-------------------+-------------------------+
- | mysql-bin.003 | 73 | test | manual,mysql |
- +--------------------+----------+-------------------+------------------------+
File列显示日志名,而Position显示偏移量。在该例子中,二进制日志值为mysql-bin.003,偏移量为73。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,从服务器应从该点开始从主服务器上进行新的更新。
5、取得快照并记录日志名和偏移量后,回到前一终端重新启用写活动。
- mysql> UNLOCK TABLES;
- (注:以上的步骤主要是为了取得一份主库的数据,并取得当前的二进制日志点,在理解了原理之后,有很多方法可以做主从)
6、将之前导出的数据拷贝到从服务器相应的数据目录中,确保对这些文件和目录的权限正确。 chown -R mysql:mysql /usr/local/mysql/data
7、启动从服务器。在从服务器上执行下面的语句,用你的系统的实际值替换选项值(即之前通过SHOW MASTER STATUS取得的值):
- 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、启动从服务器线程:
- mysql> START SLAVE;
- 执行这些程序后,从服务器应连接主服务器,并补充自从快照以来发生的任何更新。
9、如果出现复制错误,从服务器的错误日志(HOSTNAME.err)中也会出现错误消息。
10、从服务器复制时,会在其数据目录中发现文件master.info和HOSTNAME-relay-log.info。从服务器使用这两个文件跟踪已经处理了多少主服务器的二进制日志。不要移除或编辑这些文 件,除非你确切知你正在做什么并完全理解其意义。即使这样,最好是使用CHANGE MASTER TO语句。
11、主从错误排除常用命令
- show slave status \G (用于提供有关从服务器运行的相关信息)
- show master status \G (查看主服务器的当前日志点)
- slave stop; (关闭从服务器进程)
- slave start; (启动从服务器进程)
- repair table database.table_name; (修复相应表命令)
12、MySQL同步详细信息可以查看
点我