mysql主从同步
本文最后更新于 2358 天前,其中的信息可能已经有所发展或是发生改变。

一、MySQL主从原理

MySQL主从原理以及应用场景

MySQL的Replication原理非常简单。

总结一下:

每个从仅可以设置一个主。
主在执行sql之后,记录二进制log文件(bin-log)。
从连接主,并从主获取binlog,存于本地relay-log,并从上次记住的位置起执行sql,一旦遇到错误则停止同步。

从这几条Replication原理来看,可以有这些推论:

主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。
如果主从的网络断开,从会在网络正常后,批量同步。
如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。
一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,可以工作良好。
如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。

可以应用在读写分离的场景中,用以降低单台MySQL服务器的I/O
可以实现MySQL服务的HA集群
可以是1主多从,也可以是相互主从(主主)

二、安装、配置MySQL

参考之前步骤搭建MySQL服务

实验环境:5.1.40-log

为了做实验方便,我们在同一台机器上配置两个MySQL服务(跑两个端口)

cd /usr/local/
cp -r mysql mysql2 
cd mysql_2

初始化mysql2:

./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2

拷贝配置文件:

cp /etc/my.cnf ./my.cnf

修改配置文件相关参数:

vim my.cnf #更改port 以及 socket

这里把port 改为3307和默认的3306区别开来,socket改为 /tmp/mysql2.sock

启动:

/usr/local/mysql2/bin/mysqld_safe --defaults-file=/usr/local/mysql2/my.cnf --user=mysql &

若开机启动它,需加入到 /etc/rc.local中

三、配置主从准备工作

设定mysql为主端口3306,mysql为从端口为3307

在主上创建测试库: (顺便随便安装一个web程序,这里以wordpress为例子)

create database wordpress;

导出wordpress数据库

mysqldump -uroot -S /tmp/mysql.sock wordpress > wordpress.sql

再在从上创建测试库

create database wordpress;

导入wordpress.sql到从库的wordpress

mysql -uroot -S /tmp/mysql2.sock wordpress < wordpress.sql

现在两个数据库中的内容已经是一模一样了

四、配置主(master)

vim /usr/local/mysql/my.cnf   #修改或添加:
server-id=1
log-bin=mysql-bin

两个可选参数(2选1):

binlog-do-db=db1,db2       #需要同步的库
binlog-ignore-db=db1,db2   #忽略不同步的库

修改配置文件后,重启mysql

service mysqld restart

进入数据库执行以下命令:

grant replication slave on *.* to 'repl'@'%' identified by '123123'; ## 创建主从同步账号

flush tables with read lock; ## 全局读锁定,只能读不能写。

show master status; #一定要记住前两列的内容,一会会用到。

命令结果如下:

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |   604708 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

五、设置从(slave)

vim /usr/mysql/mysql2/my.cnf #修改或增加

server-id = 2 #这个数值不能和主一样

可选参数:

replicate-do-db=db1,db2     #需要同步的库
replicate-ignore-db=db1,db2 #忽略不同步的库

更改参数之后重启mysql2,以下是获取进程,然后kill掉。

pid=`ps uax |grep mysql2.sock |grep -v grep |awk '{print $2}'` 
kill $pid; 
cd /usr/local/mysql2/bin/
./mysqld_safe --defaults-file=../my.cnf --user=mysql &
mysql -uroot -S /tmp/mysql2.sock     ##登陆从的mysql
slave stop; 
change master to master_host='127.0.0.1', master_port=3306, master_user='repl', master_password='123123', master_log_file='mysql-bin.000004', master_log_pos=604708;

## 这里的mysql-bin.000004和604708要和上面show master status命令的结果一样。

slave start;

主上:

mysql -uroot -S /tmp/mysql.sock -e "unlock tables"    ## 解除全局读锁定

从上查看从的状态:

show slave status\G;

如果发现以下两项内容都是:yes,证明主从同步已经成功。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

但是还是需要实际的测试几次。

七、测试主从

就用wordpress来测试

mysql> select count(*) from wp_posts;

+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

然后随便写一篇日志,这时候记录应该是4,看一下从库上面的记录数有没有发生变化

下面的命令可以快速插入一条日志:

insert into wordpress.wp_posts (id,post_author,post_date,post_date_gmt,post_content,post_title) values ('4','1','2016-05-16 17:13:58','2016-05-16 17:13:58','this is test','test');

建议:

MySQL主从机制比较脆弱,谨慎操作。如果重启master,务必要先把slave停掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 slave start.

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇