数据库版本:5.1.24。
4.x版本的数据库请自己去找相应文档。
英文版文档的原文地址:http://dev.mysql.com/doc/refman/5.1/en/replication-howto.html
1 在主服务器(master)正常运行的情况下,创建一个专门用来同步数据的用户。
CREATE USER ‘用户名’@'从服务器IP’ IDENTIFIED BY ‘密码’;
GRANT REPLICATION SLAVE ON *.* TO ‘用户名’@'从服务器IP’;
这个用户名和密码(明文)以后会自动保存到从服务器上的master.info里面。
2 修改主服务器上面的my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1
这个镜像系统中的每一台mysql主机都需要一个不同的server-id (1~2的32次方-1)
PS:如果使用了innodb, 还需要加上:
innodb_flush_log_at_trx_commit=1
sync_binlog=1
PS again: 主服务配置文件里面一定不能有 skip-networking
PS3: 主服务器防火墙开放3306端口给从服务器。
然后重新启动主服务器的mysqld,使配置生效。
3 获取主服务器状态信息并复制数据。
3.1 获取主服务器二进制日志的座标
在主服务器上运行一个mysql客户端,
mysql> FLUSH TABLES WITH READ LOCK;
这会flush所有的数据表,并且阻塞所有的写入操作。
对于innodb类型的表,COMMIT 语句也会阻塞。
不要退出这个mysql客户端,否则这个read lock会失效。
在主服务器上重新打开一个mysql客户端,
mysql > SHOW MASTER STATUS;
+—————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————+———-+————–+——————+
| mysql-bin.003 | 73 | test | manual,mysql |
+—————+———-+————–+——————+
File 字段显示的是二进制日志的文件名
Position 显示的是此文件中的偏移量。 抄下来这二个数据。
They represent the replication coordinates at which the slave should begin processing new updates from the master.
3.2复制数据
3.2.1 使用mysqldump
适用于数据量比较小的情况。
注意唉,现在主数据库还处于只读状态,阻塞着所有的写入操作呢,也就是说你的网站处于瘫痪状态呢。如果数据库的数据量太大,dump时间过长,有得你受的。
Shell下面执行 mysqldump –all-databases –lock-all-tables >dbdump.db
然后在FLUSH TABLES WITH READ LOCK;的那个mysql客户端里面运行:
UNLOCK TABLES;
这时,主服务器的业务恢复正常。
可以把dbdump.db复制到所有的从服务器上面了。
3.2.2 直接复制数据库文件。
适用于myisam数据量比较大的情况。
PS:使用了完全cache型的数据表可能会丢失数据。比如memory类型的表。
PS2:如果你的表使用了全文索引(full-text indexes),并且主从服务器上面的 ft_stopword_file, ft_min_word_len, ft_max_word_len 变量的值不相同的话,可能会出问题。
关闭主数据库mysqladmin shutdown,
使用cp tar 或者rsync scp等来复制数据文件(不包括日志文件,不包括mysql库的数据文件)。
开启mysqld服务。
4 关闭从数据库,并且修改从数据库上面的my.cnf
[mysqld]
server-id=2
就是这么简单。 Server-id不要和其它服务器冲突就行了。
PS:从服务器上面是否开启二进制日志都无所谓。个人建议开了好,方便数据恢复。
PS2: 不要启动从数据库。
5 从数据库导入数据。
5.1 如果数据是以mysqldump方式导出的:
使用 –skip-slave-start –replicate-ignore-db=mysql参数启动从数据库 。
然后用 mysql –uroot –p < fulldb.dump 导入。
5.2 如果是直接复制的数据文件:
把文件复制到从服务器正确的位置。
然后使用 –skip-slave-start –replicate-ignore-db=mysql参数启动从数据库。
6 在从数据库上配置镜像信息:
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;
注: master_host_name 为主服务器IP
replication_user_name 为第一步时候我们创建的用户名
replication_password 为第一步时候我们创建的密码
recorded_log_file_name 为第三步时候SHOW MASTER STATUS 获得的File字段。
recorded_log_position 为第三步时候 SHOW MASTER STATUS 获得到的Position字段。
7 在从数据库上开启镜像功能:
Mysql> start slave;
基本上这条语句是不会报错的,请查看从数据库的日志。
一旦从数据库开始进行数据同步,就会在从服务器上面生成二个文件:
master.info 和 relay-log.info
不要修改或删除这二个文件。看看是可以的。
8 重复4-7步,添加多台从服务器。
9 对于每一台从服务器,mysqld重启的话,都要加上 –replicate-ignore-db=mysql 参数,表示不同步mysql这个库。如果你有多个库需要忽略,那么就重复写这个参数。不要试图用逗号分隔多个库名,没用的。
mysql> SHOW BINARY LOGS;
+—————+———–+
| Log_name | File_size |
+—————+———–+
| binlog.000015 | 724935 |
| binlog.000016 | 733481 |
+—————+———–+
show master logs 与 show binary logs 功能相同。
SHOW BINLOG EVENTS
[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
显示二进制日志里面发生的事情
mysql> SHOW MASTER STATUS;
+—————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————+———-+————–+——————+
| mysql-bin.003 | 73 | test | manual,mysql |
+—————+———-+————–+——————+
mysql> SHOW SLAVE HOSTS;
+————+———–+——+———–+
| Server_id | Host | Port | Master_id |
+————+———–+——+———–+
| 192168010 | iconnect2 | 3306 | 192168011 |
| 1921680101 | athena | 3306 | 192168011 |
+————+———–+——+———–+
只有从服务器启动的时候加了 –report-host=host_name 参数,才会显示在这里。
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: localhost
Master_User: root
Master_Port: 3306
Connect_Retry: 3
Master_Log_File: gbichot-bin.005
Read_Master_Log_Pos: 79
Relay_Log_File: gbichot-relay-bin.005
Relay_Log_Pos: 548
……