本文将介绍如何搭建一个最简单的mysql replication 环境。
它将包括一个master主机, 和 一个slave机。 master主机上的所有修改会通过replication同步到slave机器的mysql上。
master主机的mysql启动在一个ubuntu11.10的机器上,ip为172.16.70.78,
slave机的mysql启动在一个虚拟机里,ip为172.16.69.70。
参考文献: O'Reilly.MySQL.High.Availability
1. 配置master主机mysql
启动mysql, 创建用于slave进行replication的mysql帐户,并设置密码和权限:
mysql> create user test_user@'172.16.69.70';
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to test_user@'172.16.69.70' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
注: 这里最好把slave机器的ip也指明,因为我在尝试不指明ip而用%时,似乎碰到了权限问题。
关闭mysql,修改mysql的配置文件my.cnf(一般而言在/etc/mysql 或/etc下, 如果没有的话(通常是从源码安装的时候),从源码包中拷贝一个过来,并编辑)。 修改与添加如下内容:
[mysqld]user = mysql
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
log-bin = master-bin #可选,值随意, 主要是为了看binlog文件的时候方便
log-bin-index = master-bin.index #同上
server-id =1 #这个是关键, 配置master机的server-id,这个需要全局唯一。
然后重启mysql服务即可。
2. 配置slave机的mysql
找到slave机的mysql配置文件my.cnf, 添加并修改如下内容:
[mysqld]
user = mysql
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
relay-log = slave-relay #可选,值随意, 主要是为了看binlog文件的时候方便
relay-log-index = slave-relay-bin.index #同上
server-id =2 #这个是关键, 配置slave机的server-id,这个需要全局唯一。
重启slave的mysql即可。
3. 启动slave机的replication
登入slave机的mysql执行如下命令:
mysql> change master to master_host='172.16.70.78', master_port=3306,
->master_user='test_user', master_password='123456';
Query OK, 0 rows affected (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01sec)
这样就可以了。 现在你在master机器上做任何修改,都会被同步到slave机器上。 (你可以flush logs来让binlog文件rotate)
4. 尝试过程中可能遇到的问题及解决:
a.slave I/O error connecting to master '用户名@master主机名:3306' Error_code:2003
这个错误是说在slave机器上用这个用户名无法连接到master主机上, 你可以在slave机器的终端上用mysql命令
以这个用户名连一下master主机,看看是否能连上。 如果不能连上,可能是你master主机上mysql绑定ip配置的又问提,
默认是localhost 或者172.0.0.1, 把它改为你主机的ip,如本例中的172.16.70.78 。
b. slave I/O error connecting to master '用户名@master主机名:3306' Error_code:1045
这个错误具体什么原因我也不是太清楚,我估计也是权限的问题。 查看一下你mater主机上的用户列表,slave的用户名是不是
不止一个,比如有一个"用户名@%" 在“用户名@具体ip”前面, 把那个"用户名@%"给删除,因为它的权限可能配的不对,使用
你在第一步中创建的“用户名@具体ip”。
c. 错误日志中会提示说slave机器上执行某条master主机replication过来的语句时出错,而导致整个replication的过程终止。
这个错误是master主机上执行的修改无法在slave机上进行,可能所要做的修改已经存在了。 例如master主机上创建了一个
数据库 school, 但这个数据库已经在slave机器上存在了,这就会导致replication 失败。 解决办法很简单,把那个 slave机
的school数据库drop掉就好了。