这里讲的是Master-Slave的主从复制方式(单向复制),如果需要Master-Master模式,反过来再配置一遍就可以了。
Server的OS是CentOS6.3。
主从复制(Master-Slave Replication)配置步骤:
1. 在Master和Slave上都安装Mysql server
两个mysql server的配置文件/etc/my.cnf内容改为如下,不同之处是server-id不一样,一个是1,一个是2。
其中binlog-do-db是需要复制数据的database名字,可以配置多个(写在多行)。
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#add for performance tuning
max_connections = 1500
expire_logs_days =2
max_connect_errors =100
binlog_format=mixed
log-bin=mysql_bin
server-id=1
binlog-do-db=dbname
binlog-do-db=dbname2
binlog-ignore-db=test
binlog-ignore-db=mysql
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
2. 为两个Mysql建立相同的database和table,添加用户和权限。
create database dbname;
grant all privileges on dbname.* to `user`@`%` identified by 'pass';
grant all privileges on dbname.* to `user`@`localhost` identified by 'pass';
flush privileges;
如果是已存在的Master数据库,table以及数据已经存在,则需要进行数据迁移,有两种方式迁移。
2.1 用mysqldump进行数据迁移
[master-mysql]
mysqldump -uuser -ppass -A -R dbname > masterbackup.sql
[slave-mysql]
mysql -uuser -ppass dbname < masterbackup.sql
2.2 复制数据文件进行数据迁移
例如centos默认mysql的数据目录是/var/lib/mysql
则只需要将master mysql上面的数据目录打包,覆盖slave mysql的数据目录,重启slave,就完成了数据迁移。
3. 建立数据复制
[master-mysql]
grant replication slave on *.* to `repluser`@`slave_ip` identified by 'pass' ;
运行以上命令,建立一个专门用于复制数据的用户。
show master status;
运行以上mysql命令,得到master mysql当前的数据文件和数据bin-log位置。
得到的结果应该如下:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 127 | | |
+------------------+----------+--------------+------------------+
[slave-mysql]
change master to master_host='master_ip',master_user='repluser',master_password='pass', master_log_file='mysql-bin.000001',master_log_pos=127;
start slave;
运行以上命令将slave连接到master上,启动slave数据复制。
show slave status\G;
运行以上命令查看slave状态,结果如果出现:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
则表示没有问题,数据复制已经生效。
4. 常见问题与解决方法
4.1 如果配置都没有问题,但是运行start slave出错,那么执行以下步骤:
重启master数据库,重新分配复制用户权限。重新运行第3步的操作。在slave数据库上执行:
stop slave; reset slave; start slave;
4.2 如果执行show slave status\G; 发现结果中有error,说明复制遇到了问题,若认为问题可以忽略,则执行:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=100; START SLAVE;
这样可以忽略100个错误,视当前遇到的错误个数决定。
4.3 如果调用mysql的应用程序出现下面的错误:
Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED
则说明复制使用的事务等级有问题,不符合应用程序的需求,解决方法是:
在配置文件/etc/my.cnf中配置 BINLOG_FORMAT=MIXED