Heim > Datenbank > MySQL-Tutorial > 实战MySQL主从数据库同步 增强系统安全性_MySQL

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-01 14:02:09
Original
1029 Leute haben es durchsucht

试验环境:
主服务器: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>
Nach dem Login kopieren


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>
Nach dem Login kopieren
Nach dem Login kopieren


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>
Nach dem Login kopieren


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>
Nach dem Login kopieren


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>
Nach dem Login kopieren


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>
Nach dem Login kopieren
Nach dem Login kopieren

二、从服务器

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>
Nach dem Login kopieren
Nach dem Login kopieren


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>
Nach dem Login kopieren


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>
Nach dem Login kopieren


执行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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

 

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

<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>
Nach dem Login kopieren


如以上二行同时为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>
Nach dem Login kopieren


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>
Nach dem Login kopieren

说明主从数据同步成功。

常见问题归纳:

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>
Nach dem Login kopieren

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

<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>
Nach dem Login kopieren


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

<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>
Nach dem Login kopieren


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

<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>
Nach dem Login kopieren
Nach dem Login kopieren

切换主从服务器

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

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>
Nach dem Login kopieren


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

Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage