Home >Database >Mysql Tutorial >实战MySQL主从数据库同步 增强系统安全性_MySQL

实战MySQL主从数据库同步 增强系统安全性_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 14:02:091028browse

试验环境:
主服务器:CentOS 5.2 Mysql 5.1.35 源码 IP:192.168.1.22
从服务器:CentOS 5.2 Mysql 5.1.35 源码 IP:192.168.1.33

配置:

一、主服务器

1.1、创建一个复制用户,具有replication slave 权限。
 

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>grant replication slave on *.* to ‘repl’@’192.168.1.22′ identified by ‘repl’; </span></span></li></ol>


1.2、编辑my.cnf文件
vi /etc/my.cnf
添加
server-id=1
并开启log-bin二进制日志文件
log-bin=mysql-bin
注:需要把默认的server-id=1去掉
1.3、启动mysql数据库
 

<ol class="dp-xml"><li class="alt"><span><span>mysqld_safe –</span><span class="attribute"><font color="#ff0000">user</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">mysql</font></span><span> & </span></span></li></ol>


1.4、设置读锁
 

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>flush tables with read lock; </span></span></li></ol>


1.5、得到binlog日志文件名和偏移量
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>show master status;  </span></span></li>
<li><span>+——————+———-+————–+——————+  </span></li>
<li class="alt"><span>| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |  </span></li>
<li><span>+——————+———-+————–+——————+  </span></li>
<li class="alt"><span>| mysql-bin.0000010 | 106| | |  </span></li>
<li><span>+——————+———-+————–+——————+ </span></li>
</ol>


1.6、备份要同步的数据库
 

<ol class="dp-xml"><li class="alt"><span><span>mysqldump test </span><span class="tag"><strong><font color="#006699">></font></strong></span><span> test.sql </span></span></li></ol>


1.7、解锁
 

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>unlock tables; </span></span></li></ol>

二、从服务器

2.1、编辑my.cnf文件
vi /etc/my.cnf
添加
server-id=2
注:需要把默认的server-id=1去掉
2.2、启动从数据库
 

<ol class="dp-xml"><li class="alt"><span><span>mysqld_safe –</span><span class="attribute"><font color="#ff0000">user</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">mysql</font></span><span> & </span></span></li></ol>


2.3、对从数据库进行相应设置
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span> change master to  </span></span></li>
<li>
<span>-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span> </span><span class="attribute"><font color="#ff0000">master_host</font></span><span>=’192.168.1.22′  </span>
</li>
<li class="alt">
<span>-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span> </span><span class="attribute"><font color="#ff0000">master_user</font></span><span>=’repl’  </span>
</li>
<li>
<span>-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span> </span><span class="attribute"><font color="#ff0000">master_password</font></span><span>=’repl’  </span>
</li>
<li class="alt">
<span>-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span> </span><span class="attribute"><font color="#ff0000">master_log_file</font></span><span>=’mysql-bin.0000010′  </span>
</li>
<li>
<span>-</span><span class="tag"><strong><font color="#006699">></font></strong></span><span> </span><span class="attribute"><font color="#ff0000">master_log_pos</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">106</font></span><span>; </span>
</li>
</ol>


2.4、启动从服务器slave线程
 

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>start slave; </span></span></li></ol>


执行show processlist命令显示以下进程:
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>show processlist\G  </span></span></li>
<li><span> </span></li>
<li class="alt"><span>*************************** 2. row ***************************  </span></li>
<li><span>Id: 2  </span></li>
<li class="alt"><span>User: system user  </span></li>
<li><span>Host:  </span></li>
<li class="alt"><span>db: NULL  </span></li>
<li><span>Command: Connect  </span></li>
<li class="alt"><span>Time: 2579  </span></li>
<li><span>State: Has read all relay log; waiting for the slave I/O thread to update it </span></li>
</ol>

Info: NULL表示slave已经连接上master,开始接受并执行日志
2.5、查看slave线程状态
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>show slave status;  </span></span></li>
<li><span>*************************** 1. row ***************************  </span></li>
<li class="alt"><span>Slave_IO_State: Waiting for master to send event  </span></li>
<li><span>Master_Host: 192.168.1.22  </span></li>
<li class="alt"><span>Master_User: repl  </span></li>
<li><span>Master_Port: 3306  </span></li>
<li class="alt"><span>Connect_Retry: 60  </span></li>
<li><span>Master_Log_File: mysql-bin.0000010  </span></li>
<li class="alt"><span>Read_Master_Log_Pos: 106  </span></li>
<li><span>Relay_Log_File: centos-relay-bin.000002  </span></li>
<li class="alt"><span>Relay_Log_Pos: 529  </span></li>
<li><span>Relay_Master_Log_File: mysql-bin.0000010  </span></li>
<li class="alt"><span>Slave_IO_Running: Yes  </span></li>
<li><span>Slave_SQL_Running: Yes  </span></li>
<li class="alt"><span>Replicate_Do_DB:  </span></li>
<li><span>Replicate_Ignore_DB:  </span></li>
<li class="alt"><span>Replicate_Do_Table:  </span></li>
<li><span>Replicate_Ignore_Table:  </span></li>
<li class="alt"><span>Replicate_Wild_Do_Table:  </span></li>
<li><span>Replicate_Wild_Ignore_Table:  </span></li>
<li class="alt"><span>Last_Errno: 0  </span></li>
<li><span>Last_Error:  </span></li>
<li class="alt"><span>Skip_Counter: 0  </span></li>
<li><span>Exec_Master_Log_Pos: 106  </span></li>
<li class="alt"><span>Relay_Log_Space: 830  </span></li>
<li><span>Until_Condition: None  </span></li>
<li class="alt"><span>Until_Log_File:  </span></li>
<li><span>Until_Log_Pos: 0  </span></li>
<li class="alt"><span>Master_SSL_Allowed: No  </span></li>
<li><span>Master_SSL_CA_File:  </span></li>
<li class="alt"><span>Master_SSL_CA_Path:  </span></li>
<li><span>Master_SSL_Cert:  </span></li>
<li class="alt"><span>Master_SSL_Cipher:  </span></li>
<li><span>Master_SSL_Key:  </span></li>
<li class="alt"><span>Seconds_Behind_Master: 0  </span></li>
<li><span>Master_SSL_Verify_Server_Cert: No  </span></li>
<li class="alt"><span>Last_IO_Errno: 0  </span></li>
<li><span>Last_IO_Error:  </span></li>
<li class="alt"><span>Last_SQL_Errno: 0  </span></li>
<li><span>Last_SQL_Error:  </span></li>
<li class="alt"><span>1 row in set (0.00 sec) </span></li>
</ol>

 

验证是否配置正确
在从服务器上执行
 

<ol class="dp-xml">
<li class="alt"><span><span>show slave status\G;  </span></span></li>
<li><span>Waiting for master to send event  </span></li>
<li class="alt"><span>Slave_IO_Running: Yes  </span></li>
<li><span>Slave_SQL_Running: Yes </span></li>
</ol>


如以上二行同时为Yes 说明配置成功

测试:

1、在主服务器test数据库中创建user表
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>use test;  </span></span></li>
<li>
<span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>create table user(id int); </span>
</li>
</ol>


2、在从服务器中查看user表
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>use test;  </span></span></li>
<li>
<span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span> show tables like ‘user’;  </span>
</li>
<li class="alt"><span>+———————-+  </span></li>
<li><span>| Tables_in_test(user) |  </span></li>
<li class="alt"><span>+———————-+  </span></li>
<li><span>| user |  </span></li>
<li class="alt"><span>+———————-+  </span></li>
<li><span>1 row in set (0.00 sec) </span></li>
</ol>

说明主从数据同步成功。

常见问题归纳:

1.在从数据库中查看slave状态时出现
The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the –replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it)
说明方从服务器里my.cnf中的server-id有相同的。
解决办法:
修改my.cnf里的server-id,并重启数据库服务。my.cnf文件默认有server-id=1

其它说明
主服务器my.cnf
#binlog-do-db=需要备份的数据库名,可写多行
#binlog-ignore-db=不需要备份的数据库名,可写多行
从服务器my.cnf
# replicate-do-db=test 需要备份的数据库名
# replicate-ignore-db=mysql 忽略的数据库
# master-connect-retry=60 如果从服务器发现主服务器断掉,重新连接的时间差(秒)
以下设置也可直接修改my.cnf配置文件
 

<ol class="dp-xml">
<li class="alt"><span><span class="attribute"><font color="#ff0000">log-bin</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">mysql</font></span><span>-bin  </span></span></li>
<li>
<span class="attribute"><font color="#ff0000">master-host</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">192</font></span><span>.168.1.22  </span>
</li>
<li class="alt">
<span class="attribute"><font color="#ff0000">master-user</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">repl</font></span><span> </span>
</li>
<li>
<span class="attribute"><font color="#ff0000">master-password</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">repl</font></span><span> </span>
</li>
<li class="alt">
<span class="attribute"><font color="#ff0000">master-port</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">3306</font></span><span> </span>
</li>
</ol>

主从服务器同步维护
由于各种原因,导致主从数据不一致,在负载低的时候,进行手动同步.
在主服务器上执行

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>flush tables with read lock;  </span></span></li>
<li><span>Query OK,rows affected (0.01 sec)  </span></li>
<li class="alt">
<span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>show master status;  </span>
</li>
<li><span>+——————+———-+————–+——————+  </span></li>
<li class="alt"><span>| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |  </span></li>
<li><span>+——————+———-+————–+——————+  </span></li>
<li class="alt"><span>| mysql-bin.0000011 | 260| | |  </span></li>
<li><span>+——————+———-+————–+——————+ </span></li>
</ol>


在从服务器上执行
先得到当前主服务器的二进制文件名和偏移量,执行命令使从服务器与主服务器同步
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>select master_pos_wait(‘mysql-bin.0000011′,’260′);  </span></span></li>
<li><span>+————————————————–+  </span></li>
<li class="alt"><span>| master_pos_wait(‘mysql-bin.0000011′,’260′) |  </span></li>
<li><span>+————————————————–+  </span></li>
<li class="alt"><span>| 0 |  </span></li>
<li><span>+————————————————–+  </span></li>
<li class="alt"><span>1 row in set (0.01 sec) </span></li>
</ol>


同步完成后,在主服务器上执行解锁
 

<ol class="dp-xml"><li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>unlock tables; </span></span></li></ol>

切换主从服务器

当主服务器出现故障时,可将从服务器当主服务器来使用.步骤如下:
1、保证所有从数据库都已经执行了relay log中的全部更新,在从服务器中执行
stop slave io_thread,用show processlist检查,查看状态是否是Has read all relay log,表示更新完成.
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>stop slave io_thread;  </span></span></li>
<li><span>Query OK,0 affected (0.00 sec)  </span></li>
<li class="alt">
<span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>show processlist\G;  </span>
</li>
<li><span>*************************** 2. row ***************************  </span></li>
<li class="alt"><span>Id: 2  </span></li>
<li><span>User: system user  </span></li>
<li class="alt"><span>Host:  </span></li>
<li><span>db: NULL  </span></li>
<li class="alt"><span>Command: Connect  </span></li>
<li><span>Time: 4757  </span></li>
<li class="alt"><span>State: Has read all relay log; waiting for the slave I/O thread to update it  </span></li>
<li><span>Info: NULL </span></li>
</ol>

2、在从服务器上执行stop slave,reset master命令,重置成主数据库
 

<ol class="dp-xml">
<li class="alt"><span><span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>stop slave;  </span></span></li>
<li><span>Query OK,0 affected (0.00 sec)  </span></li>
<li class="alt">
<span>mysql</span><span class="tag"><strong><font color="#006699">></font></strong></span><span>reset master;  </span>
</li>
<li><span>Query OK,0 affected (0.00 sec) </span></li>
</ol>


3、删除新的主服务器数据库目录中的master.info和relay-log.info文件,否则下次重启时还会按照从服务器来启动.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn