我是数据库管理的新手。
设置mysql主从复制时,我遇到很多问题。
我还面临常规的mysql复制故障排除问题。
有人可以帮助我了解如何应对所有这些问题吗?
我是数据库管理的新手。
设置mysql主从复制时,我遇到很多问题。
我还面临常规的mysql复制故障排除问题。
有人可以帮助我了解如何应对所有这些问题吗?
Answers:
我提供了教程的链接。请记住,在Ubuntu上,my.cnf文件位于/etc/mysql/my.cnf中,而不是howtoforge教程中的/etc/my.cnf中。在我的设置中,我没有使用带读锁的FLUSH TABLES。在主人身上。如果您的主服务器有很多写活动,则可能需要在备份之前通过运行该命令来锁定表。如果将FLUSH TABLES WITH READ LOCK;使用,则在备份后,您将需要运行UNLOCK TABLES。如果您遇到任何问题,请告诉我。
这是我在Howto伪造的教程上找到的,它是为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
重新启动MySQL:
/etc/init.d/mysql restart
连接到mysql的控制台:mysql -u root -ppassword
创建并授予复制用户权限。
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';
确保将此信息复制到某处或使其可见
SHOW MASTER STATUS \G;
mysql> show master status \G;
File: mysql-bin.000001
Position: 100
Binlog_Do_DB:
Binlog_Ignore_DB:
mysql> quit
将数据库转储到文件中:
mysqldump -u root -p databasename > /tmp/databasename-backup.sql
如果愿意,可使用scp将数据库转储复制到从属服务器或使用ftp:
scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/
编辑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
重新启动MySQL: /etc/init.d/mysql restart
恢复备份:
mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql
连接到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;
运行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)
此后,请记住复制可能由于各种原因而失败。在从站上,可以通过运行命令SHOW SLAVE STATUS \ G;来监视状态。或设置cron作业以监视状态并在失败时发送电子邮件。熟悉此命令的输出。如果复制正常运行,则应该看到“ Slave_IO_State:正在等待主服务器发送事件”。
正确设置后,我可以为您提供脚本来监视该复制。
这是一个脚本,用于监视MySQL中的错误日志。如果添加行
[mysqld]
日志错误= /var/log/mysql/mysql.err
重新启动mysql:/etc/init.d/mysql重新启动
然后,您可以使用以下脚本监视日志文件。如果日志以任何方式更改,您将收到一封电子邮件,通知您从属服务器上发生了错误。如果要定期检查错误日志,则需要将此脚本添加到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
要添加到crontab。
使脚本可执行:
chmod +x /somepath/monitor_mysql_log.sh
更新crontab:
crontab -e
* * * * * /somepath/monitor_mysql_log.sh
脚本将每分钟运行一次。
我提供的脚本是我很快组合在一起的脚本。另外,为了使服务器能够发送电子邮件,您必须安装诸如postfix或sendmail之类的东西。
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 stop
mv /var/lib/mysql /var/lib/mysql2
或在磁盘空间不足的情况下将其压缩)mkdir /var/lib/mysql; cd /var/lib/mysql
tar xvzif /path/to/backup/mysql.tgz
。注意i
tar操作上的选项-没有该选项将无法使用。如果您的数据库很大,这将需要一段时间。/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/mysql
service mysql start
cat xtrabackup_binlog_info
。它会说类似mysql-bin.000916 13889427
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;
更改为与实际的数据库服务器详细信息匹配)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中进行设置,可以避免最常见的复制损坏形式。就是说,以我的经验,复制通常并不麻烦。