配置 MySQL 主从服务结构
网络上配置 MySQL 主从服务器结构的文章很多, 本文的主要目的不是再给其
添加一个, 而是:
1. 公司项目使用 MySQL 主从, 写下来以后如果出问题, 可以重新配置.(备忘)
2. 自己不致于遗忘, 因为配置这种事是一次性的, 不是需要熟练的工作.
3. 使别人放心.
配置共6步, 分别如下:
1. 在主 MySQL 配置文件 my.cnf, 在我们的 Ubuntu linux 机器上该配置文件
位于 /etc/mysql 目录下. 里面检查 [mysqld] 小节下的 server-id,
log_bin 的设置. 如下:
[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = test # 需要复制的数据库(列表)
binlog_ignore_db = mysql # (复制中忽略的数据库)
配置之后重新启动 MySQL, 方法是 service mysql restart (注意在不同的 linux
上不同, 我们的系统是这个命令).
请校验配置正确, MySQL 能够正确启动. 如果不能启动, 请检查是否配置写错或...
进入 mysql 命令, 执行 select @@server_id; 或
show global variables like 'server_id'; 查看 server-id 配置是否生效了, 值
是否正确. log_bin 也可类似方式查看.
2. 在主 MySQL 上备份数据. 具体小步骤按照顺序执行如下:
2.a) 锁定整个数据库使只读. 使用命令 flush tables with read lock;
2.b) 备份数据库数据. 方法很多, 可自选. 我选择用 mysqldump, 如:
mysqldump -h localhost -u root -p dbname > /tmp/dbbackup.sql
2.c) 记录主服务器当前 log_bin 文件名和偏移量, 目的是在从服务器上使用其
值从该位置开始进行数据的恢复. 使用命令 show master status \G
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 243
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
记录下 File, Position 两项. 在配置从服务器时候会用到.
2.d) 上述操作之后, 恢复写操作, 使用命令 unlock tables;
3. 在主 MySQL 中建立用于复制的账户, 并授权具有 replication slave 权限.
mysql>GRANT REPLICATION SLAVE ON *.* TO 'slave_001'@'192.168.0.111'
IDENTIFIED BY 'password';
记录下用户名和密码.
使用这个账户进行复制, 其才具有必要且安全的权限. 一定不要用 root 账户.
4. 将备份的数据导入到从数据库. 可以进入 mysql 命令行, 执行
source /tmp/dbackup.sql; 命令. 别的方法也可自选.
5. 配置从服务器的配置文件 my.cnf:
[mysqld]
server-id = 2 # 一定不能和主服务器相同, 也不能和别的从服务器冲突.
log_bin = /var/log/mysql/mysql-bin.log
replicate-do-db = test
网络上部分文章在这里配置 master-host, master-user 等, 我们实验了导致不能启动.
配置了之后重新启动, 并检查是否配置正确. 方法同步骤1中所述.
6. 在从服务器中 mysql 命令行执行:
mysql>CHANGE MASTER TO
> MASTER_HOST='192.168.0.100', # 主 MySQL 地址
> MASTER_USER='slave_001', # 用于复制的账户
> MASTER_PASSWORD='password', # slave_001 的密码
> MASTER_LOG_FILE='mysql-bin.000003', # 步骤2中记录的日志文件名和位置.
> MASTER_LOG_POS=243;
注意: 要检查 datadir (在我们机器配置中位于目录 /var/lib/mysql) 中是否有文件
master.info; 根据某些文档说必须要删除该文档, 才能正确执行 CHANGE MASTER 命令.
为了保险起见, 建议删除或改名该文件再执行 CHANGE MASTER 命令.
然后启动 slave, 使用命令: start slave; 检查 slave 状态: show slave status \G
正常情况下, slave 的两个线程 slave_io, slave_sql 的 running 状态是 yes.
此时, 可以试验在主服务器上执行更新操作(insert,update等), 然后验证从服务器上
是否进行了复制.
主从服务器在使用过程中还可能发生错误, 如我们已经遇到了在主服务器上执行的错误
SQL 语句导致 从服务器上 slave_sql 线程暂停堵塞(此时可看到 last_sql_error 信息).
因此要注意监控 slave 的相应状态, 遇到问题再去检查是什么原因并解决.