如何在CentOS 6中配置MySQL主从复制

时间:2019-08-20 17:58:30  来源:igfitidea点击:

在主从复制中,一个数据库服务器(Master)可以将数据库复制到一个或者多个MySQL数据库服务器(Slave)。

从服务器不需要总是与主服务器连接,一旦从服务器启动并且当我们启动从线程(start Slave命令)时,它将再次自动接收所有复制的更新。

在本教程中,我们将学习如何在CentOS 6.4中设置MySQL主从复制。

搭建环境

  • 操作系统:CentOS 6.4
  • 架构:i386
  • MySQL版本:5.5
  • 主服务器ip地址:192.168.56.121
  • 从服务器ip地址:192.168.56.108
  • iptables服务是停止的(/etc/init.d/iptables stop)
  • SELINUX是禁用的。

在主服务器和从服务器上安装必备组件

yum install mysql mysql-server mysql-devel

MySQL主服务器配置步骤

用root用户登录主服务器。

备份my.cnf文件

cp -p /etc/my.cnf /etc/my.cnf.orig.`date +%F`

编辑my.cnf

/var/lib/mysql默认为mysql数据目录的路径,如果情况不同,则修改 datadir

vi /etc/my.cnf

在mysqld块后面添加下面内容:

[mysqld]    

bind-address=192.168.56.121
server-id=1
binlog-ignore-db = "mysql"
binlog-format = mixed
log-bin=mysql-bin
datadir=/var/lib/mysql
innodb_flush_log_at_trx_commit=1
sync_binlog=1

重启MySQL服务器

/etc/init.d/mysqld restart

以root用户身份登录MySQL主服务器。并为复制创建用户。

这里,我们将使用replication作为新的用户名。

CREATE USER [email protected];
GRANT REPLICATION SLAVE ON *.* TO [email protected] IDENTIFIED BY 'password';
flush privileges;
exit

进行数据库转储(导出数据库数据)

mysqldump --skip-lock-tables --single-transaction --hex-blob --flush-logs --master-data=2 -u root -p database-name > database-name-backup.sql

再次登录Master MySQL 服务器,执行下面命令

mysql> FLUSH TABLES WITH READ LOCK;

mysql> show master status;

mysql> unlock tables;

记录File和Position的值。

例如:

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.000002 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

也可以从MySQL转储文件中获取 MASTER_LOG_FILE,MASTER_LOG_POS的信息。

[root@localhost ~]# head -100 database-name-backup.sql | grep "MASTER_LOG_POS"
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=107;
[root@localhost ~]#

把数据库备份转储文件上传到从服务器中

scp  database-name-backup.sql [email protected]:~

MySQL从服务器的配置步骤

登录从MySQL服务器,备份my.cnf文件

cp -p /etc/my.cnf /etc/my.cnf.orig.`date +%F`

编辑my.cnf

vi /etc/my.cnf

在mysqld块后面添加内容如下:(如果有多个从服务器,server-id不能一样)

[mysqld]      

server-id=50
binlog-format=mixed
log_bin=mysql-bin
relay-log=mysql-relay-bin
log-slave-updates=1
read-only=1

重启从服务器mysql服务

/etc/init.d/mysqld restart

登录MySQL,创建数据库

mysql > create database database-name;
mysql > exit;

恢复数据库中的转储文件

mysql -u root -p database-name < database-name-backup.sql

再次登录MySQL,运行下面给出的命令

MASTER_LOG_FILE和MASTER_LOG_POS的值来自主服务器。

mysql > CHANGE MASTER TO MASTER_HOST='192.168.56.121',MASTER_USER='replication',MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=107;

现在运行从属服务并检查其状态。

mysql > START SLAVE;
mysql > SHOW SLAVE STATUS G;

现在从属服务器已经启动并运行,数据正在同步

要停止从属服务:

mysql > STOP SLAVE;

如何知道SLAVE服务是否正常工作?

执行命令SHOW SLAVE STATUS G后,会有一些状态。
Slave_IO_State="Waiting master to send event"(显示slave等待master发送事件)
Last_Error=0 (显示错误的编号,0表示成功)
Seconds_Behind_Master=0(滞后主服的时间)

您还可以通过创建测试数据库或更新/创建表来检查主从复制的状态。