关于 mysql 的复制
mysql 复制也就是能够让你容易的维护数据的多个拷贝.它很有用的. 如备份数据啊. 在不用主数据库的情况下分析数据, 还有就是扩展.
本文主要介绍 mysql 一个主服务器备份数据到一个备库. 涉及到两个 IP 和机器,可以使用 vagrant 来轻松搞定.
假如我们使用 vagrant 来作本 demo. 两个服务器就是:
- 192.168.0.100 master
- 192.168.0.200 slave
安装
sudo apt-get install mysql-sever mysql-client vim
第一步配置主服务器
编辑 mysql 默认配置文件, 主要修改的地方就是修改服务器默认的 IP 地址配置.
sudo vim /etc/mysql/my.cnf
找到 bind-address
这个配置项,然后把默认的本地的地址改为当前机器实际在局域网中的地址, 如
bind-address = 192.168.0.1000
接着就是本服务器的标示, server-id
, 默认是1
,但是是注释了的,放开注释. 还有就是 log-bin
配置项, 这个文件就是用来作为复制的依据,表明它的位置., 还有一个 binlog_do_db
, 它用来指定需要复制那些数据库的.如我们复制这个数据库,
binlog_do_db = example
最后,重启数据库.
之后,我们需要登录客户端,给一个假定要复制我们数据的用户给复制权限:
GRANT REPLICATION SLAVE ON . TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
为了避免此时有人写数据,确保当前要复制的库表没有差异, 我们锁住它,我们这样:
use example;
flush tables with read lock;
show master status;
会得到这样的结果:
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 107 | newdatabase | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
这里会有一个位置,来告诉从哪里进行复制. 注意,如果你在同一个终端下有其他的操作的话,这样会释放这个锁的.所以你需要新开一个窗口. 然后因为有锁,你可以导出数据,
mysqldump -u root -p --opt example > example.sql
你可以释放锁了,现在,
unlock tables;
\q
第二步,配置备服务器
接着我们要搞定备机, 安装 mysql 等都和第一步是一样的. 我们用客户端登录 mysql. 然后创建一个要复制的数据库, 然后导入刚才我们 dump 出来的表结构.
接着,我们同样需要修改 mysql 的配置文件,
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = example
这个地方,其实我们已经熟悉了他们的意思,但是 relay-log
有点陌生. 你需要这样写. 保存, 重启 mysql
接下来,就是给这个服务器注册主服务器了.:
CHANGE MASTER TO MASTER_HOST='192.168.0.100',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;
它干了几点事情呢?
- 指定了当前服务器是那台机器的备机
- 登录信息
- 告诉服务器从哪里开始复制,
然后,开启复制
start slave
我们看一下当前备机的状态:
show slave status\G
\G 参数可以让输出更加易读, 如果你在了解备机的时候遇到问题,可以通过下面的命令来搞定:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; SLAVE START;
see more: