Welcome 微信登录

首页 / 数据库 / MySQL / MySQL 复制 on Ubuntu12.04

一、简介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_64Master:主机名 mysql-0,IP 192.168.150.200Slave: 主机名 mysql-1,IP 192.168.150.2041、在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; 参考:http://dev.mysql.com/doc/refman/5.5/en/replication.html Mysql的官方文档写得真心不错,清晰易懂。禁用Mysql复制
1、在Slave上停止复制,执行:
mysql> STOP SLAVE;2、在Master上,编辑 /etc/mysql/my.cnf,注释掉如下几行:
report-host=192.168.150.200
server-id=23、在Slave上寻找master.info文件:
~$ sudo find / -name master.info | grep master.info
找到后,删除,或者重命名,或者移动到其他目录。
重启Slave的mysql server。
mysqld-relay-bin.* 等文件可以删除了。3、在Master上,编辑 /etc/mysql/my.cnf,注释掉如下几行:
server-id=1
log-bin=mysql-binary-log
binlog_format=MIXED
innodb_flush_log_at_trx_commit=1
sync_binlog=1innodb_fast_shutdown=0 可以选择保留
重启Slave的mysql server。
mysql-binary-log.* 等文件可以删除了。--------------------------------------分割线 --------------------------------------Ubuntu 14.04下安装MySQL http://www.linuxidc.com/Linux/2014-05/102366.htm《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF http://www.linuxidc.com/Linux/2014-03/98821.htmUbuntu 14.04 LTS 安装 LNMP NginxPHP5 (PHP-FPM)MySQL http://www.linuxidc.com/Linux/2014-05/102351.htmUbuntu 14.04下搭建MySQL主从服务器 http://www.linuxidc.com/Linux/2014-05/101599.htmUbuntu 12.04 LTS 构建高可用分布式 MySQL 集群 http://www.linuxidc.com/Linux/2013-11/93019.htmUbuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb http://www.linuxidc.com/Linux/2013-08/89270.htmMySQL-5.5.38通用二进制安装 http://www.linuxidc.com/Linux/2014-07/104509.htm--------------------------------------分割线 --------------------------------------更多Ubuntu相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2本文永久更新链接地址