mysql 复制(replication)基于binnary logging机制,将数据在master和slave之间同步。无论机制、配置、运行维护都比mssql2000的
一、简介
mysql 复制(replication)基于binnary logging机制,,将数据在master和slave之间同步。无论机制、配置、运行维护都比mssql2000的复制简单稳定很多(mssql2000之后的版本没用过)。
mysql master将数据更新、变化作为事件写入binary log,mysql slave读取binary log的事件并将相同的更新、变化写入自己的数据库。
master只管自己写binary log,不用照看slave。slave只要在线,数据即可持续同步;即使slave离线,恢复在线后可以继续执行未完成的复制。这一点非常适合进行数据备份,因为在slave上备份丝毫不影响master的运行。
master可以有多个slaves,slave也可以同时作为master并且拥有自己的slaves。
每一个master和slave必须在my.cnf中指定唯一的 server-id。
在slave上,复制可以随时使用简单的指令停止、恢复。
binary log有三种格式:statement,row,mixed。statement格式基于sql语句,性能高但不支持某些sql语句;row格式基于行,能克服statement格式的缺点但会产生较大的日志;mixed结合二者特点,默认使用statement,当statement格式不适用时自动转为row格式。推荐mixed,可以在master的my.cnf中设定此参数。
二、设置mysql复制非常简单,场景如下。
os:ubuntu12.04 x86_64
master:主机名 mysql-0,ip 192.168.150.200
slave: 主机名 mysql-1,ip 192.168.150.204
1、在master上:
编辑文件/etc/mysql/my.cnf 确保有如下几行(后3行是innodb引擎必须的,建议加上)
[mysqld]
bind-address=0.0.0.0
server-id=1
log-bin=mysql-binary-log #这个名字自己随便起
binlog_format=mixed
innodb_fast_shutdown=0
innodb_flush_log_at_trx_commit=1
sync_binlog=1
然后重启master的mysql server。
创建一个用户
mysql> create user 'repl'@'192.168.150.200' identified by 'pass4repl';
mysql> grant replication slave on *.* to 'repl'@'192.168.150.200';
为slave获得binary log坐标,首先要使数据库暂时只读,执行:
mysql> flush tables with read lock;
此终端窗口不动,另外打开一个终端窗口连接到mysql server,执行:
mysql> show master status;
+-------------------------+----------+--------------+------------------+
| file | position | binlog_do_db | binlog_ignore_db |
+-------------------------+----------+--------------+------------------+
| mysql-binary-log.000001 | 106 | | |
+-------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
记下来这两个值mysql-binary-log.000001、106,一会儿设置slave时要用到,注意,这是我的测试结果,你的结果很可能不同。(binlog_do_db 和 binlog_ignore_db也许能决定哪些库复制哪些库不复制,这个以后研究)
如果master上已经有了数据,则需要先用mysqldump或者原始数据拷贝生成现有数据的”快照“,应用到slave服务器上,再配置slave。
一般用mysqldump做备份,再拷贝到slave上恢复就能满足大部分需求。特殊情况稍微复杂些,可以参考官方链接:
16.1.1.5 creating a data snapshot using mysqldump
16.1.1.6 creating a data snapshot using raw data files
如果master上没有用户数据,或者已经把数据快照应用到slave上,就可以在刚才执行”flush tables with read lock;“的终端窗口里执行
mysql> unlock tables;
以解锁master数据库,然后继续配置slave。(或者退出该终端窗口也可)
2、在slave上:
编辑文件/etc/mysql/my.cnf 确保有如下2行
[mysqld]
report-host=192.168.150.200
server-id=2
重启一下slave的mysql server。
然后在mysql中执行:
mysql> change master to
-> master_host='192.168.150.200',
-> master_user='repl',
-> master_password='pass4repl',
-> master_log_file='mysql-binary-log.000001',
-> master_log_pos=106;
大功告成!
3、简单的管理任务(结果数据来自官方文档)
在master上
mysql> show processlist \g;
*************************** 4. row ***************************
id: 10
user: root
host: slave1:58371
db: null
command: binlog dump
time: 777
state: has sent all binlog to slave; waiting for binlog to be updated
info: null
mysql> show slave hosts;
+-----------+--------+------+-------------------+-----------+
| server_id | host | port | rpl_recovery_rank | master_id |
+-----------+--------+------+-------------------+-----------+
| 10 | slave1 | 3306 | 0 | 1 |
+-----------+--------+------+-------------------+-----------+
1 row in set (0.00 sec)
在slave上
mysql> show slave status \g
mysql> stop slave;
mysql> start slave;
参考: mysql的官方文档写得真心不错,清晰易懂。
禁用mysql复制:
1、在slave上停止复制,执行:
mysql> stop slave;
2、在master上,编辑 /etc/mysql/my.cnf,注释掉如下几行:
report-host=192.168.150.200
server-id=2