如何在Ubuntu 9.10中的MySQL中设置数据库复制
本教程介绍如何在MySQL中设置数据库复制。 MySQL复制允许您从其他服务器(从服务器)上的主服务器获取数据库的准确副本,并且主服务器上数据库的所有更新都将立即复制到从服务器上的数据库,以便两个数据库都处于同步状态。 这不是备份策略,因为也会在从属设备上执行意外发出的DELETE命令; 但复制可以帮助防止硬件故障。
我不会保证这将为您工作!
1初步说明
在本教程中,我将演示如何将IP地址为192.168.0.100
的服务器server1.example.com
(master)的数据库exampledb
复制
到服务器server2.example.com
(从站),IP地址为192.168.0.101
。 两个系统都运行Ubuntu 9.10; 然而,配置应该适用于几乎所有的配置,很少或没有修改。 具有表和数据的数据库exampledb
已经存在于主服务器上,但不存在于从服务器上。
我使用root权限运行本教程中的所有步骤,因此请确保以root用户身份登录:
sudo su
请启用server2
上的根帐户(如果您还没有这样做),以便我们可以使用scp
将文件从server1
传输到server2
:
server2:
passwd root
2安装MySQL 5
如果MySQL5尚未安装在server1
和server2上
,请立即安装:
server1 / server2:
aptitude install mysql-server mysql-client
您将被要求为MySQL root用户提供密码 - 此密码对用户root @ localhost
以及root@server1.example.com
/ root@server2.example.com有效
,因此我们不必稍后手动指定MySQL根密码:
MySQL“root”用户的新密码:
< - yourrootsqlpassword
重复MySQL“root”用户的密码:
< - yourrootsqlpassword
3配置主机
为了确保复制可以正常工作,我们必须让MySQL在master ( server1
)上的所有接口上监听,因此我们在/etc/mysql/my.cnf中注释了bind-address =
127.0.0.1
:
server1:
vi /etc/mysql/my.cnf
[...] # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1 [...] |
之后重启MySQL:
/etc/init.d/mysql restart
然后检查
netstat -tap | grep mysql
MySQL正在监听主节点上的所有接口:
root@server1:~# netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 2166/mysqld
root@server1:~#
现在我们设置一个可以由server2
使用的复制用户slave_user
来访问server1
上的MySQL数据库:
mysql -u root -p
在MySQL shell上,运行以下命令:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password';
FLUSH PRIVILEGES;
quit;
此外,我们必须告诉MySQL哪个数据库应该写入日志(这些日志被从机使用以查看主机上发生了什么变化),哪个日志文件应该使用,我们必须指定这个MySQL服务器是主。 我们要复制数据库exampledb
,所以我们在/etc/mysql/my.cnf
(在[mysqld]
部分)中添加/启用以下行):
vi /etc/mysql/my.cnf
[...] # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. server-id = 1 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M binlog_do_db = exampledb [...] |
然后重启MySQL:
/etc/init.d/mysql restart
接下来,我们将exampledb
数据库锁定在server1上
,了解server1
的主状态,创建一个exampledb
的SQL转储(我们将导入到server2
中的exampledb
,以便两个数据库都包含相同的数据),并解锁数据库可以再次使用:
mysql -u root -p
在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 | 19467 | exampledb | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql>
现在不要离开MySQL shell,因为如果你离开它,数据库锁将被删除,这不是我们现在想要的,因为我们现在必须创建一个数据库转储。 当MySQL shell仍然打开时,我们打开一个第二个命令行窗口,我们创建SQL转储snapshot.sql
并将其传输到server2
(使用scp):
server1:
cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql root@192.168.0.101:/tmp
之后,可以关闭第二个命令行窗口。 在第一个命令行窗口中,我们现在可以解锁数据库并离开MySQL shell:
server1:
UNLOCK TABLES;
quit;