如果配置主从,从库需要读取的是比较旧的日志,而这些日志没有被主服务器操作系统缓存,必须从磁盘中进行读取,那么可能会导致大量的磁盘读写,从而严重影响数据库繁忙的生产系统,可以考虑的办法是不要直接从主库中进行日志传递,而是专门搭建一个日志服务器。
配置守完日志服务器之后,把从库索取的日志文件放到日志服务器中,然后再从这个日志服务器进行同步。
我们也可以使用日志服务器来进行时间点恢复,利用复制来进行时间点恢复不是用mysqlbinlog来进行,注意原因如下:
* 复制是被久经考验的,而mysqlbinlog则不是那么可靠。
* 复制的速度更快。
* 复制可以更方便地查看进度。
* 复制有更多控制,更容易处理复制错误,也可以过滤事件。
配置日志服务器进行时间点恢复的步骤如下:
1) 部署安装。
下载MySQL二进制官方安装包。
wget mysql5.1.58-linux-x86_64-glibc23.tar.gz
下载sandbox,创建安装用户。
wget https://launchpad.net/mysql-sandbox/mysql-sandbox-3/mysql-sandbox-3/+download/mysql-Sandbox-3.0.28.tar.gz
useradd sandbox
usermod -G mysql sandbox
解压到目录/home/sandbox/pkgs/mysql-Sandbox-3.0.28/,进行安装。注意不要将解压的二进制包的目录删除了。
# as normal user
export PATH=$HOME/usr/local/mysql/bin:$PATH
##export PERL5LIB=$HOME/usr/local/lib/perl5/site_perl/5.8.8
perl Makefile.PL PREFIX=$HOME/local/sandbox
make
make test
make install
将/home/sandbox/local/sandbox/bin路径添加到PATH变量。
执行如下命令安装MySQL实例。
make_sandbox /home/sandbox/pkgsmysql5.1.58-linux-x86_64-glibc23.tar.gz
安装成功后,/home/sandbox/sandboxs/msb_5_1_58下同时生成了很多便于管理的脚本,如start、stop、use等。
配置字符集,并添加日志临时目录(默认生成的实例是没有日志的)。
./stop
修改配置文件
[client]
default-character-set = utf8
[mysqld]
character-set-serve = utf8
default-storage-engine=innodb
./start
./use
> status
2) 以下命令将查找最近的二进制文件,并且将日志传递到sandbox主机,准备测试。
find ./ -type f -name "mysql-bin.*" -newer mysql-bin.025050 \xargs ls -lrt > /tmp/all_file.txt
scp -P 9922 -p `cat /tmp/all_file.txt` sandbox@11.11.11.11:/home/sandbox/mysqllog_tmp
3) 配置日志服务器。
通过以上步骤,日志目录放在/home/mysql/mysqllog_tmp处,我们可运行如下命令生成日志索引文件mysql-bin.index。
cd /home/sandbox/mysqllog_tmp
ls -1 /home/sandbox/mysqllog_tmp/mysql-bin.[0-9]* > mysql-bin.index
./stop
修改配置文件my.sandbox.cnf,添加如下配置项。
log_bin = /home/sandbox/mysqllog_tmp/mysql-bin
log_bin_index = /home/sandbox/mysqllog_tmp/mysql-bin.index
./start
启动成功。
./use
> show binary logs
4) 配置复制用户
./use --user=root
> GRANT REPLICATION SLAVE ON *.* TO 'rsandbox'@'10.%' IDENTIFIED BY 'rsandbox';
5) 配置主从同步,进行时间点恢复,恢复到指定时间。
基本步骤如下:
向从库导入一份历史备份,配置主人同步,然后应用日志服务器的日志,我们可以设置同步到某个时间点。可使用如下命令,同步到某个指定的位置。
START SLAVE [SQL_THREAD] UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS=log_pos