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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-01 14:02:09
Original
1029 people have browsed it

试验环境:
主服务器: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>
Copy after login


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>
Copy after login
Copy after login


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>
Copy after login


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>
Copy after login


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>
Copy after login


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>
Copy after login
Copy after login

二、从服务器

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>
Copy after login
Copy after login


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>
Copy after login


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>
Copy after login


执行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>
Copy after login

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>
Copy after login

 

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

<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>
Copy after login


如以上二行同时为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>
Copy after login


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>
Copy after login

说明主从数据同步成功。

常见问题归纳:

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>
Copy after login

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

<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>
Copy after login


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

<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>
Copy after login


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

<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>
Copy after login
Copy after login

切换主从服务器

当主服务器出现故障时,可将从服务器当主服务器来使用.步骤如下:
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>
Copy after login

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>
Copy after login


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

Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template