最近遇到一个案列,MySQL主机已经存有10G左右的数据并且每天还在以1G为单位增长。现在需要制定备份策略并且用于数据备份和服务器维护的停机时间要尽可能的短。
对此,我们打算配置Master主服务器 -> Slave从服务器单向同步复制并且在Slave机上做周期增量备份。如果Master因意外灾难无法继续服务可以立即切换Slave机顶替服务。以下内容中Master机指主服务器,Slave机指从服务器。
1. 开启二进制日志服务(5.1版本中二进制日志替换了老的更新日志),启动MySQL时加–log-bin参数或在my.cnf中加上这一行。后面可以跟文件名来指定日志名,扩展名会被自动忽略。默认文件名为mysqld-bin.0000x。数字x会自动增长并且mysqld-bin.index中会指定当前的日志文件索引,请勿手工维护.index文件。
2. 建立账户用户数据复制,该账户必须授予REPLICATION SLAVE权限。鉴于我们还需要从Slave机上执行LOAD DATA FROM MASTER 和 LOAD DATA FROM MASTER,还需要授予账户SUPER和RELOAD全局权限。并且为所有想要装载的表授予SELECT权限。任何该 账户不能SELECT的主服务器上的表被LOAD DATA FROM MASTER忽略掉。
例如[code lang=”sql”]
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’%.mydomain.com’ IDENTIFIED BY ‘slavepass’;
[/code]
3. 执行FLUSH TABLES WITH READ LOCK语句清空所有表和块写入语句:
[code lang=”sql”]
mysql> FLUSH TABLES WITH READ LOCK;
[/code]
4. 鉴于原始数据库已经有超过10G的容量,现在使用mysqldump把数据备份成一个巨大的.sql文件显然是不明智的选择。可以简单地复制数据库文件到Slave机来快速创建一个主机的快照。Unix上用tar,windows上用winzip均可。
5. 当FLUSH TABLES WITH READ LOCK所置读锁定有效时,读取主服务器上当前的二进制日志名和偏移量值:
[code lang=”sql”]
mysql> SHOW MASTER STATUS;
[/code]
File列显示日志名,而Position显示偏移量。在该例子中,二进制日志值为mysql-bin.000007,偏移量为2268600。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,从服务器应从该点开始从主服务器上进行新的更新。
6. 主服务器数据库文件备份完成并且记录上述日志名和偏移量后,可以在主服务器上重新启用写活动:
[code lang=”sql”]
mysql> UNLOCK TABLES;
[/code]
7. 检查Master机上的my.cnf配置,确保在[mysqld]部分除开启log-bin外且指定server-id=1。这里我们将Master机上的server-id指定为1,Slave机上的my.cnf中将其指定为2。
8. 启动Slave机(在此之前已经复制了Master上的数据文件),用–skip-slave-start选项启动从服务器,以便它不立即尝试连接主服务器。
9. 在从服务器上执行下面的语句,用Master机的实际值替换选项值:
[code lang=”sql”]
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;
[/code]
10. 启动Slave服务器上的复制进程
[code lang=”sql”]
mysql> START SLAVE;
[/code]
执行这些程序后,从服务器应连接主服务器,并补充自从数据库文件备份以来发生的任何更新。
至此,我们备份策略中的主从机单向复制同步已经配置完成。