如何在Fedora 10上设置MySQL数据库复制

如何在Fedora 10上设置MySQL数据库复制

版本1.0
作者:Falko Timme

本教程介绍如何在MySQL中设置数据库复制。 MySQL复制允许您从其他服务器(从服务器)上的主服务器获取数据库的准确副本,并且主服务器上数据库的所有更新都将立即复制到从服务器上的数据库,以便两个数据库都处于同步状态。 这不是备份策略,因为也会在从属设备上执行意外发出的DELETE命令; 但复制可以帮助防止硬件故障。 本教程中我将使用Fedora 10作为主人和从属人员。

我想先说说这不是建立这样一个系统的唯一途径。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!

1初步说明

本教程中使用两台Fedora 10服务器:

  • server1.example.com (IP 192.168.0.100 ):master
  • server2.example.com (IP 192.168.0.101 ):从属

在本教程中,我将展示如何将数据库exampledbserver1.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_RunningSlave_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链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏