MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重要,新手往往在出现主从同步错误的时候不知道如何入手,这篇文章就是根据自己的经验来详细叙述mysql主从的管理。
MYSQL主从同步的作用
(1) 数据分布
(2) 负载平衡(load balancing)
(3) 备份
(4) 高可用性(high availability)和容错
MYSQL主从同步的原理
关于MYSQL的主从同步,最主要的是要了解MYSQL的主从同步是如何工作的也即主从同步的原理,通过下图能很明白的指导其工作的过程:
大致描述一下过程:从服务器的IO线程从主服务器获取二进制日志,并在本地保存为中继日志,然后通过SQL线程来在从上执行中继日志中的内容,从而使从库和主库保持一致。主从同步的详细过程如下:
1. 主服务器验证连接。
2. 主服务器为从服务器开启一个线程。
3. 从服务器将主服务器日志的偏移位告诉主服务器。
4. 主服务器检查该值是否小于当前二进制日志偏移位。
5. 如果小于,则通知从服务器来取数据。
6. 从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠。
7. 当主服务器有更新时,主服务器线程被激活,并将二进制日志推送给从服务器,并通知从服务器线程进入工作状态。
8. 从服务器SQL线程执行二进制日志,随后进入睡眠状态。
环境:
主从服务器上的MySQL数据库版本同为5.1.34
主机IP:192.168.1.200
从机IP:192.168.1.201
现在主库上创建库和表做测试用
Mysql> create database test2;
Mysql> use test2;
Mysql>
create
table
blog_user
(
user_Name
char
(15)
not
null
check
(user_Name !=
''
),
user_Password
char
(15)
not
null
,
user_emial
varchar
(20)
not
null
unique
,
primary
key
(user_Name)
)engine=innodb
default
charset=utf8 auto_increment=1;
一. MySQL主服务器配置
1.编辑配置文件/etc/my.cnf (其余参数保持默认)
[mysqld] //必须在【mysqld】这个模块下
server-id=1 //主从服务器的server-id 不能相同
log-bin=mysql-bin //开启二进制同步日志
#binlog-do-db=test2 //需要同步的数据库,这行不写默认为所有库
binlog-ignore-db=information_schema,performacen_schema,mysql //不需要同步的数据库
2.建立用户
mysql> grant replication slave on *.* to wenqiang@‘192.168.1.201’identified by ‘123456′;
//允许用户wenqiang 使用密码:123456 ,从192.168.1.201这台从服务器登陆主服务器
mysql>flush privileges; //刷新权限
// 可在Slave上做连接测试: mysql -h 192.168.1.200 -u wenqiang �Cp
3.锁主库表
mysql> FLUSH TABLES WITH READ LOCK;
4.显示主库信息
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
| mysql-bin.000007 | 371 | test2 | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
5.另开一个终端,备份(导出)需要复制的数据库
# mysqldump -u root --opt --default-character-set=utf8 -p --all- databases >/tmp/master.sql
导出sql脚本
mysqldump -u 用户名 -p 数据库名 > 存放位置
mysqldump -u root -p test > c:/a.sql
//用mysqldump命令导出字符集为(utf8)的所有数据库,导出到目录/tmp下的master.sql
二. MySQL从服务器配置
1、 将主数据库的master.sql传输到从服务器的 /tmp目录下
#scp -pr /tmp/master.sql 192.168.1.121:/tmp
2、 导入数据库
# mysql -u root -p --default-character-set=utf8 < master.sql
导入sql脚本
mysql -u 用户名 -p 数据库名 < 存放位置
mysqljump -u root -p test < c:/a.sql
3、解锁主库表
mysql> UNLOCK TABLES;
4、 编辑/etc/my.cnf(其余参数保持默认)
[mysqld] //必须在【mysqld】这个模块下
Server-id=2 //不能与master的id相同
log-bin=mysql-bin //开启二进制日志
master-port=3306 //端口号
master-connect-retry=60 #如果从服务器发现主服务器断掉,重新连接的时间差
5、在SLAVE上设置同步
mysql> slave stop; //关闭slave 服务
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.200',MASTER_USER='wenqiang',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=371;
#使用用户wenqiang登陆主服务器192.168.1.200,并复制mysql-bin.000007和371
6、启动SLAVE服务
mysql> slave start;
7、查看SLAVE状态
mysql> SHOW SLAVE STATUS\G;
其中 Slave_IO_Running 和 Slave_SQL_Running 两列的值都为 "Yes",表明 Slave 的 I/O 和 SQL 线程都在正常运行