master-slave
replication-howto。replication可以做什么?
- 读写分离。所有更新都在master上进行,slave上只进行读取操作,减轻master的压力。
- 数据安全。全量备份数据时,可以在slave上进行,避免中断正在提供服务的master。
- 统计分析。对大量历史数据进行统计分析时,可以在slave上进行。
- 长距离数据分配。比如:可以在开发环境中通过slave访问到线上数据,而无需获得对master的访问权限。
查看Master状态
在session1中获取一个读锁,这会阻塞写操作, InnoDB 表还会阻塞 COMMIT 操作。
FLUSH TABLES WITH READ LOCK;
在session2中查看MASTER的状态,并记录
File
和Position
的值mysql -p -e "SHOW MASTER STATUS" > start_status.txt
示例结果:
```sql
SHOW MASTER STATUS;
+------------------+-----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000029 | 424473475 | naladb | | |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
```
(可选)通过raw文件备份数据库
tar cf /tmp/db.tar ./data # date ; tar cf mysql.tar ./mysql ; date
配合相应的时机,在session1中释放所有读锁
UNLOCK TABLES;
对于在master中已经有数据的主从配置步骤
初始状态:master在运行,slave未运行。
master配置 :
vi my.cnf
,如果尚未配置,则修改后需要重启。[mysqld] log-bin=mysql-bin server-id=1 binlog-do-db=xxxDb # 可选,只有启动bin-log的数据库才能完成replication
slave配置 :
vi my.cnf
[mysqld] server-id=2 relay-log=relay-log replicate-do-db=db_name # 可选 replicate-ignore-db=db_name # 可选 replicate-do-table=db_name.tbl_name # 可选 replicate-ignore-table=db_name.tbl_name # 可选 # 注意:master-xxx参数从5.5开始被移除了,从5.6开始如果还有该参数,会启动报错。这些参数只能通过 CHANGE MASTER TO 命令完成,比如:在命令行中执行 -- change master to master_host='192.168.101.86', master_user='s82', master_password='nalanala', master_log_file='mysql-bin.000159', master_log_pos=0;
在master上创建用于Replication的用户。
任何用户均可,需要有 REPLICATION SLAVE 权限。 用户名和密码需要以明文的方式存储在 master.info 中,故最好单独创建一个这样的账户,赋予最小权限。
CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com'; SHOW GRANTS;
使用 mysqldump 获取master快照备份,并在slave上恢复。
# 在master上 # 参数 `--master-data` 会自动追加一条 `CHANGE MASTER TO` 语句到结果中的。 mysqldump --all-databases --master-data > dbdump.db # 在slave上 mysql < dbdump.db
使用 raw 文件(MyISAM)获取master快照备份,并在slave上恢复。 (InnoDB需要停止服务器,故不建议使用该方式)
确保以下变量在master和slave上一致。
show variables where variable_name in ('ft_stopword_file', 'ft_min_word_len', 'ft_max_word_len');
- 参考前面的 "查看Master状态",以获取master的状态并备份raw文件。
- 将备份文件加压到slave机器上
- 使用
--skip-slave-start
参数启动slave
在slave上设置master信息,并启动
RESET SLAVE -- 可选 CHANGE MASTER TO MASTER_HOST = 'master_host_name', MASTER_USER = 'replication_user_name', MASTER_PASSWORD = 'replication_password', MASTER_LOG_FILE = 'recorded_log_file_name', MASTER_LOG_POS = recorded_log_position; START SLAVE;
在slave上确认状态
show slave status \G
如果同步出现问题,可以参考这里进行排查。如果在 slave 上执行
show slave status \G
,且结果中 Slave_SQL_Running 为 No 时,可以。- master:
show master status
,并记下 File 和 Position的值。 - slave :
stop slave
- slave :
RESET SLAVE
-- ??? 请自行斟酌是否使用 - slave :
CHANGE MASTER TO ...
- slave :
start slave
- master: