如何在Fedora 10上设置MySQL数据库复制
版本1.0
作者:Falko Timme
本教程介绍如何在MySQL中设置数据库复制。 MySQL复制允许您从其他服务器(从服务器)上的主服务器获取数据库的准确副本,并且主服务器上数据库的所有更新都将立即复制到从服务器上的数据库,以便两个数据库都处于同步状态。 这不是备份策略,因为也会在从属设备上执行意外发出的DELETE命令; 但复制可以帮助防止硬件故障。 本教程中我将使用Fedora 10作为主人和从属人员。
我想先说说这不是建立这样一个系统的唯一途径。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!
1初步说明
本教程中使用两台Fedora 10服务器:
-
server1.example.com
(IP192.168.0.100
):master -
server2.example.com
(IP192.168.0.101
):从属
在本教程中,我将展示如何将数据库exampledb
从server1.example.com
(master)复制到server2.example.com
(从属)。
我假设已经安装了MySQL(例如,如第10章所示)并在两台服务器上工作。 具有表和数据的数据库exampledb
已经存在于主服务器上,但不存在于从服务器上。
2配置主设备
server1:
首先我们为MySQL bin-logs创建一个日志目录:
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
然后我们编辑/etc/my.cnf
; 我们必须告诉MySQL哪个数据库应该写入日志(这些日志被从机使用以查看主机上发生了什么变化),它应该使用哪个日志文件,我们必须指定这个MySQL服务器是主服务器。 我们要复制数据库exampledb
,所以我们把以下行放到/etc/my.cnf
(在[mysqld]
部分!)):
vi /etc/my.cnf
[mysqld] [...] log-bin = /var/log/mysql/mysql-bin.log binlog-do-db=exampledb server-id=1 [...] |
然后我们重新启动MySQL:
/etc/init.d/mysqld restart
然后我们以root身份
登录MySQL数据库,并创建具有复制权限的用户:
mysql -u root -p
Enter password:
现在我们在MySQL shell上。
STOP SLAVE;
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password';
FLUSH PRIVILEGES;
接下来(仍然在MySQL shell上)这样做:
USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
最后一个命令应该是这样的(请写下来,稍后我们需要)
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 98 | exampledb | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql>
现在不要离开MySQL shell,因为如果你离开它,数据库锁将被删除,这不是我们现在想要的,因为我们现在必须创建一个数据库转储。 当MySQL shell仍然打开时,我们打开一个第二个命令行窗口,我们创建SQL转储snapshot.sql
并将其传输到server2
(使用scp):
cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql root@192.168.0.101:/tmp
之后,可以关闭第二个命令行窗口。 在第一个命令行窗口中,我们现在可以解锁数据库并离开MySQL shell:
UNLOCK TABLES;
quit;
3配置从站
server2:
现在我们必须告诉MySQL从机是从机,主机是192.168.0.100
,而要监视的master数据库是exampledb
。 因此,我们将以下行添加到/etc/my.cnf中的[mysqld]
部分:
vi /etc/my.cnf
[mysqld] [...] server-id=2 master-host=192.168.0.100 master-user=slave_user master-password=slave_password master-connect-retry=60 replicate-do-db=exampledb [...] |
然后我们重新启动MySQL:
/etc/init.d/mysqld restart
现在我们在从站上创建空数据库exampledb
(确保运行STOP SLAVE;
停止所有的从进程,如果有的话)):
mysql -u root -p
Enter password:
STOP SLAVE;
CREATE DATABASE exampledb;
quit;
我们现在可以导入SQL转储snapshot.sql
,如下所示:
cd /tmp
mysql -u root -pyourrootsqlpassword exampledb < snapshot.sql
然后我们再次连接到MySQL
mysql -u root -p
Enter password:
...并运行以下命令使server2
成为server1
的从站( 重要的是您将以下命令中的值替换为从在server1上运行的SHOW MASTER STATUS;命令获取的值 ):
CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
最后启动Minion:
START SLAVE;
然后检查从站状态:
SHOW SLAVE STATUS\G
重要的是, Slave_IO_Running
和Slave_SQL_Running
在输出中都具有值Yes
(否则出现问题,您应该再次检查您的设置,并查看/var/log/mysqld.log
以了解任何错误):
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.100
Master_User: slave_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 98
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: exampledb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
mysql>
之后,您可以将MySQL shell放在server2上
:
quit;
而已! 现在,只要在master
上更新exampledb
,所有更改将被复制到从站上的exampledb
。 测试吧
4链接
- MySQL: http : //www.mysql.com/
- Fedora: http : //fedoraproject.org/