【IT168技术文档】MySQLReplication-MySQL数据库抄写。
为何要作Replication(抄写)
· 报表(Reporting)-对于需产出大量报表的数据库而言,为不影响MasterDB的效能,建议另外建置一个专属的报表数据库。
· 数据安全-数据库抄写至SlaveDB,必要时可随时关闭抄写程序。对SlaveDB作数据库备份也可避免对MasterDB的在线运作影响。
· 异地备份 - 对于分公司数据库的复制或异地备份需求。
不同版本间抄写的兼容性
官方手册-http://dev.mysql.com/doc/refman/5.0/...atibility.html
基本上不同版本之间的数据库抄写,建议是从旧版本抄写至下一个新版本,例如你可以从MySQL4.1.x抄写至MySQL5.0.x,或从MySQL5.0.x抄写至MySQL5.1.x,不过为求系统稳定性,还是建议尽量以同个主版本来建置两个数据库间的抄写。
系统环境
Master DB)
Purpose: Production
IP address: 10.10.10.112
DB version: mysql-server-5.0.22-2.2.el5_1.1
Slave DB)
Purpose: Backup or Reporting
IP address: 10.10.10.134
DB version: mysql-server-5.0.45-7.el5
如何建置两个数据库的抄写
新增一个数据库用户用以执行抄写
这个用户是在MasterDB,用来让SlaveDB连接用,其权限仅需要开启REPLICATIONSLAVE,例如新增一个用户为repl,密码为replpass。
在MasterDB执行下列SQLstatements:
mysql> GRANTREPLICATIONSLAVEON*.*TO'repl'@'10.10.10.134'IDENTIFIEDBY'replpass';
mysql> GRANTREPLICATIONSLAVEON*.*TO'repl'@'10.10.10.134'IDENTIFIEDBY'replpass';
你可以对每一个SlaveDB设定不同连接账号,也可以用同一个账号。Tip:
上述的新增账户方式是以SlaveDB的IP来限制连接的来源,如果实际的操作环境有使用domain也可以改成
domain name 方式来作,详细方法请参考官方的在线手册。
要验证账号是否可以运作,可以在 Slave DB 尝试使用该账号连接,请在 Slave DB 执行下述指令
shell> mysql -u repl --password='replpass' -h 10.10.10.112
设定MasterDB
要作抄写的MasterDB必须开启binarylogging,并且在每一个DB主机上,需设定不同的server-id值,这个值是用来辨识群组内的不同主机识别用,其值是介于1-232 。
请关闭MySQL并修改/etc/my.cnf内容如下:
shell> service mysqld stopshell> vi /etc/my.cnf
[mysqld]
# Replication on Master DB
log-bin=mysql-bin
server-id=1
shell> service mysqld start
取得MasterDB 抄写点信息
为了要使SlaveDB作抄写,必须先在MasterDB上确定目前的数据点信息,以使SlaveDB可以从目前的数据点开始作数据抄写,如此可确保两端的数据是同步的。
要取得 Master DB 目前数据点,必须先锁住要作作抄写数据库的所有 tables 的写入操作。
在MasterDB执行下述SQLstatements:
mysql> FLUSH TABLES WITH READ LOCK;Query OK, 0 rows affected (0.01 sec)
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 5752 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
请记住这两项信息,后续设定SlaveDB时会用到:File -binarylog檔名
Position - 数据点位置
注意:
对于 InnoDB tables,当执行 FLUSH TABLES WITH READ LOCK 时会锁定所有 table 的 COMMIT 操作。
如果未开启 binary logging,这两字段 File & Position 则为显示空白及 4。
设定SlaveDB
关闭MySQL并修改/etc/my.cnf内容如下:
shell> service mysqld stopshell> vi /etc/my.cnf
[mysqld]
# Replication on Slave DB
server-id=2
Tips:
如果有多部 Slave DB,每一个 DB 必须设不同的 server-id 值,这就类似主机 IP 地址一样,如果 DB 未指定
server-id 时,系统默认为 0。
在 Slave DB 不需要开启 binary logging,不过,如果有开启此参数时,可以作数据库备份以及数据库异常的回复
作业,同时对其他不同的 Slave DB,可以切换为 Master DB。
现有数据库从Master至Slave的复制
如果MasterDB已存有数据,请在锁住tables后继续使用下述方法将数据库复制到SlaveDB。
停止 MySQL 然后 tar 数据库目录,在 Master DB 执行下述:
shell> service mysqld stopshell> cd /var/lib/mysql
shell> tar -czf ~/my_db.tar.gz
shell> service mysqld start
shell> mysql -u root -pmysql> UNLOCK TABLES;
先关闭SlaveDB的MySQL将上述的tar档复制到SlaveDB后解压缩,最后重新以--skip-slave启动MySQL,在SlaveDB执行下述:
shell> service mysqld stopshell> cd /var/lib/mysql
shell> tar -xzf ~/my_db.tar.gzshell> mysqld_safe --skip-slave &
记得,数据库完成复制后,就可以恢复MasterDB的数据库存取操作,在MasterDB使用下述指令,解除数据表锁定:
mysql> UNLOCK TABLES;
在SlaveDB 设定Master连接参数
在SlaveDB执行下述statements:
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.10.10.112',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='replpass',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=5752;
mysql> START SLAVE;
以上请输入来自MasterDB的抄写点数据。
到这里,SlaveDB已经完成与MasterDB的抄写设置,第一次作抄写时,你可以发现在SlaveDB的MySQL资料库目录/var/lib/mysql,有两个档案master.info及relay-log.info,这两个纪录有关与MasterDB连接的信息。
如何检查数据库抄写状态
官方手册:
http://http://dev.mysql.com/doc/refman/5.0/en/replication-administration-status.html
http://dev.mysql.com/doc/refman/5.0/en/show-slave-status.html
在SlaveDB执行下述statement:
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.10.112
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 98
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:
Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0
Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:
Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
\G-这参数可以调整为较友善的显示方式。
在MasterDB检查SlaveDB状态,执行下述statement,搜寻有无BinlogDump。
mysql> show processlist \G;
*************************** 2. row ***************************Id: 3
User: repl
Host: 10.10.10.134:2065
db: NULL
Command: Binlog Dump
Time: 1381
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
2 rows in set (0.01 sec)
参考连结
MySQL 5.0 Reference Manual :: 16 Replication