创建 MySQL 主从复制设置和故障排除的最佳方法是什么?

Abd*_*naf 15 mysql replication mysql-5

我对数据库管理很陌生。

我在设置mysql主从复制时遇到了很多问题。

我还面临常规的 mysql 复制故障排除问题。

任何人都可以帮助理解我应该如何处理所有这些吗?

Cra*_*ein 20

我提供了教程链接。请记住,在 Ubuntu 上,my.cnf 文件位于 /etc/mysql/my.cnf 中,而不是像 howtoforge 教程中那样位于 /etc/my.cnf 中。在我的设置中,我没有使用 FLUSH TABLES WITH READ LOCK;在主人身上。如果您的主服务器有大量写入活动,您可能需要在备份之前通过运行该命令来锁定您的表。如果您使用 FLUSH TABLES WITH READ LOCK;,那么在备份之后,您将需要运行 UNLOCK TABLES。如果您遇到任何问题,请告诉我。

这是我在如何伪造上找到的教程,为 Redhat/CentOS 制作:http : //www.howtoforge.com/mysql_database_replication

另一个适用于 Ubuntu 的教程 http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

这是我使用的配置:

在主服务器上

配置主服务器:

vi /etc/mysql/my.cnf

[mysqld]

# bind-address = 127.0.0.1 (comment this out)
server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
max_binlog_size     = 100M
expire_logs_days    = 1
Run Code Online (Sandbox Code Playgroud)

重启 MySQL:

/etc/init.d/mysql restart

连接到mysql的控制台:mysql -u root -ppassword

创建复制用户并授予权限。

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';
Run Code Online (Sandbox Code Playgroud)

确保将此信息复制到某处或使其可见

SHOW MASTER STATUS \G;
mysql> show master status \G;
            File: mysql-bin.000001
        Position: 100
    Binlog_Do_DB: 
Binlog_Ignore_DB:

mysql> quit 
Run Code Online (Sandbox Code Playgroud)

将数据库转储到文件:

mysqldump -u root -p databasename > /tmp/databasename-backup.sql
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以使用 scp 或使用 ftp 将数据库转储复制到从服务器:

scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/
Run Code Online (Sandbox Code Playgroud)

在从服务器上

编辑mysql配置:

vi /etc/mysql/my.cnf
[mysqld]

# slave server configuration
server_id           = 2

# this is optional, but I find it useful to specify where the relay logs go to control.  
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.  
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M
Run Code Online (Sandbox Code Playgroud)

重启 MySQL: /etc/init.d/mysql restart

恢复备份:

mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql
Run Code Online (Sandbox Code Playgroud)

连接到 MySQL:

mysql -u root -ppassword

stop slave;

# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;

start slave;
Run Code Online (Sandbox Code Playgroud)

运行SHOW SLAVE STATUS\G

mysql> show slave status\G;
             Slave_IO_State: Waiting for master to send event
                Master_Host: ipaddressmaster
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.0000001
        Read_Master_Log_Pos: 100
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 1
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        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: 17324288
            Relay_Log_Space: 17324425
            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.02 sec)
Run Code Online (Sandbox Code Playgroud)

之后,请记住复制可能会因各种原因而失败。在从站上,您可以通过运行命令 SHOW SLAVE STATUS \G 来监控状态;或者设置一个 cron 作业来监控状态并在失败时发送电子邮件。熟悉此命令的输出。如果复制运行正常,您应该看到“Slave_IO_State: Waiting for master to send event”。

一旦您正确地进行了此设置,我就可以为您提供一个脚本来监控该复制。

这里有一个脚本来监控 MySQL 中的错误日志。如果添加行

[mysqld]

日志错误= /var/log/mysql/mysql.err

重启 mysql : /etc/init.d/mysql restart

然后您可以使用以下脚本来监视日志文件。如果日志以任何方式发生变化,您将收到一封电子邮件,通知您从服务器上发生了错误。如果您希望定期检查错误日志,则需要将此脚本添加到您的 crontab。

这是一个示例脚本:/somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="addressemail@something.com"

# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err

# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1

# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG

[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO

# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG
Run Code Online (Sandbox Code Playgroud)

添加到 crontab。

使脚本可执行:

chmod +x /somepath/monitor_mysql_log.sh
Run Code Online (Sandbox Code Playgroud)

更新 crontab:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh
Run Code Online (Sandbox Code Playgroud)

脚本将每分钟运行一次。

我提供的脚本是我刚刚快速组合在一起的脚本。此外,为了让您的服务器能够发送电子邮件,您必须安装诸如 postfix 或 sendmail 之类的东西。


小智 7

Mysqldump 速度很快,但对于大数据库来说,还原转储可能会非常慢,而且在实时站点上锁定表是不可接受的。设置从站的更好更快的方法是使用Percona 的 XtraBackup。XtraBackup 对主服务器的负载很小,不需要锁,从服务器上的恢复速度非常快。这种机制确实产生了整个数据库的完整克隆,包括用户表之类的东西,这会破坏一些由库存安装设置的东西,例如 debian-sys-maint 用户,这不一定是坏事!

作为奖励,一旦您知道如何执行此操作,您就可以使用完全相同的机制进行日常备份。备份比 mysqldump 慢,但恢复要快得多,如果您处于恐慌状态并需要恢复备份,这正是您所需要的!如果您遇到重大的复制错误,只需使用此过程来删除从属设备并重建它;真的不需要很长时间。

您将需要为您的发行版设置Percona 的 apt/yum 存储库,然后xtrabackup在主服务器和从服务器上安装该软件包。我还强烈建议使用pigz压缩实用程序(并行 gzip,在大多数标准存储库中可用),因为它对备份速度产生了巨大的影响。

这个过程是这样的(在 Ubuntu 上,其他发行版可能略有不同),并假设你已经在你的从站上安装了 MySQL:

  1. 首先在master上做一个备份:(mkdir -p /var/xtrabackup; /usr/bin/innobackupex --slave-info --stream=tar --throttle=1500 /var/xtrabackup 2> /tmp/xtrabackup.out | /usr/bin/pigz -p 4 -c --best -q > /var/backups/mysql.tgz调整节流值,限制备份对直播服务的影响)
  2. 将备份文件复制到从站(使用scp -l 400000为了不让主站对实时客户端的网络带宽感到饥饿)
  3. 在从站上停止 mysql: service mysql stop
  4. 将旧的 MySQL 数据目录移开:(mv /var/lib/mysql /var/lib/mysql2如果磁盘空间不足,则将其压缩到某处)
  5. 创建一个新的数据目录并移入其中: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. 将备份文件解压到新文件夹中:tar xvzif /path/to/backup/mysql.tgz. 请注意itar 操作的选项 - 没有它它将无法工作。如果您有一个大数据库,这将需要一段时间。
  7. 对提取的文件运行 Innobackupex 工具:/usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql. 这有效地对二进制日志中的文件运行了崩溃恢复。这只需几秒钟;如果在较小的服务器上,则使用较小的内存量。
  8. 假设成功完成,删除备份并设置文件的所有权: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. 启动mysql: service mysql start
  10. 获取主日志文件名和备份(注意不是在xtrabackup_slave_info的信息)的位置:cat xtrabackup_binlog_info。它会说类似的话mysql-bin.000916 13889427
  11. 连接到 MySQL 并检查那里的东西。
  12. 使用您获得的有关日志的详细信息重置复制设置:(CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;更改以匹配真实的数据库服务器详细信息)
  13. 重启从站: START SLAVE;
  14. 检查从站的状态,因为它赶上主站,直到 'seconds_behind_master' 为 0: SHOW SLAVE STATUS\G

你的奴隶现在已经设置好了。如果需要,您现在可以设置循环复制:

  1. 在从站上:FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;注意日志文件名和位置(类似于 mysql-bin.000031 和 17244785)。
  2. 在 master: 上CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=17244785;,从我们刚刚查看的 slave 插入值。
  3. 在主人身上: START SLAVE;
  4. 在奴隶上: UNLOCK TABLES;

您现在应该已设置好循环复制。

就故障排除而言,Percona 的工具包提供了各种帮助,例如校验和以发现静默损坏、滞后测量等。通过binlog_format = MIXED在 my.cnf 中进行设置,可以避免最常见的复制损坏形式。也就是说,根据我的经验,复制通常并不麻烦。