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:
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调整节流值,限制备份对直播服务的影响)scp -l 400000为了不让主站对实时客户端的网络带宽感到饥饿)service mysql stopmv /var/lib/mysql /var/lib/mysql2如果磁盘空间不足,则将其压缩到某处)mkdir /var/lib/mysql; cd /var/lib/mysqltar xvzif /path/to/backup/mysql.tgz. 请注意itar 操作的选项 - 没有它它将无法工作。如果您有一个大数据库,这将需要一段时间。/usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql. 这有效地对二进制日志中的文件运行了崩溃恢复。这只需几秒钟;如果在较小的服务器上,则使用较小的内存量。rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysqlservice mysql startcat xtrabackup_binlog_info。它会说类似的话mysql-bin.000916 13889427CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;更改以匹配真实的数据库服务器详细信息)START SLAVE;SHOW SLAVE STATUS\G你的奴隶现在已经设置好了。如果需要,您现在可以设置循环复制:
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;注意日志文件名和位置(类似于 mysql-bin.000031 和 17244785)。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 插入值。START SLAVE;UNLOCK TABLES;您现在应该已设置好循环复制。
就故障排除而言,Percona 的工具包提供了各种帮助,例如校验和以发现静默损坏、滞后测量等。通过binlog_format = MIXED在 my.cnf 中进行设置,可以避免最常见的复制损坏形式。也就是说,根据我的经验,复制通常并不麻烦。
| 归档时间: |
|
| 查看次数: |
25677 次 |
| 最近记录: |