技术开发 频道

MySQL Replication 实作

  【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

  http://dev.mysql.com/doc/refman/5.0/en/replication.html

0
相关文章