天天看点

利用percona-xtrabackup快速搭建MySQL数据库主从复制

linux服务器a运行mysql服务,并开启了log-bin(log-bin = mysql-bin)和指定了server-id(server-id = 1);

linux服务器b也以与服务器a同样的方式(不同样也可以,参考下面的“注意”)安装了mysql服务,可开启log-bin也可不开启log-bin,如果开启了log-bin则需要注意mysql function的限制问题(可通过set global log_bin_trust_function_creators=true;解决);

注意:

服务器a和服务器b最好采用相近的硬件配置和数据库安装参数。如果数据库都是编译安装的,那需要注意配置libmysqlclient18,否则会导致手动安装的percona-xtrabackup运行时报错,说找不到某些运行文件。

可参考:

1

2

3

4

5

6

7

8

9

10

11

<code># set mysql library    </code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/lib/libmysqlclient</code><code>.so.18.0.0 </code><code>/usr/lib64/libmysqlclient</code><code>.so.18.0.0    </code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/lib/libmysqlclient</code><code>.so.18.0.0 </code><code>/usr/lib64/libmysqlclient</code><code>.so.18    </code>

<code>ln</code> <code>-s </code><code>/usr/local/mysql/lib/libmysqlclient</code><code>.so.18.0.0 </code><code>/usr/lib64/libmysqlclient</code><code>.so    </code>

<code>ls</code> <code>-l </code><code>/usr/lib64/libmysqlclient</code><code>.so.18.0.0    </code>

<code>ls</code> <code>-l </code><code>/usr/lib64/libmysqlclient</code><code>.so.18    </code>

<code>ls</code> <code>-l </code><code>/usr/lib64/libmysqlclient</code><code>.so    </code>

<code>vim </code><code>/etc/ld</code><code>.so.conf.d</code><code>/mysql-x86_64</code><code>.conf     </code>

<code>    </code><code>/usr/lib64/mysql</code>     

<code>    </code><code>/usr/local/mysql/lib</code>    

<code>ldconfig</code>

percona-xtrabackup是一个开源免费的mysql备份工具,支持热备(也就是说备份过程中不影响数据库使用,io和部分cpu资源还是需要的,但一般来说对数据库服务器的影响并不是很大,特别是当数据库的数据目录和备份目录是所在磁盘是高性能磁盘或者不同的磁盘时,对其影响微乎甚微)。

它的备份原理与冷copy数据库数据库目录基本类似,但做的更精细一下,比如自动忽略某些不需要的日志、文件等。

centos默认源中没有percona-xtrabackup这个工具包,只能采用手动安装的方式。

<code>cd</code>   

<code>wget -c https:</code><code>//www</code><code>.percona.com</code><code>/downloads/xtrabackup/percona-xtrabackup-2</code><code>.2.12</code><code>/binary/tarball/percona-xtrabackup-2</code><code>.2.12-linux-x86_64.</code><code>tar</code><code>.gz    </code>

<code>tar</code> <code>zxf percona-xtrabackup-2.2.12-linux-x86_64.</code><code>tar</code><code>.gz     </code>

<code>cd</code> <code>percona-xtrabackup-2.2.12-linux-x86_64</code><code>/bin</code>    

<code>yum -y </code><code>install</code> <code>perl perl-time-hires    </code>

<code>ln</code> <code>-s </code><code>/root/percona-xtrabackup-2</code><code>.2.12-linux-x86_64</code><code>/bin/innobackupex</code> <code>/usr/bin/innobackupex</code>    

<code>ln</code> <code>-s </code><code>/root/percona-xtrabackup-2</code><code>.2.12-linux-x86_64</code><code>/bin/xbcrypt</code> <code>/usr/bin/xbcrypt</code>    

<code>ln</code> <code>-s </code><code>/root/percona-xtrabackup-2</code><code>.2.12-linux-x86_64</code><code>/bin/xbstream</code> <code>/usr/bin/xbstream</code>    

<code>ln</code> <code>-s </code><code>/root/percona-xtrabackup-2</code><code>.2.12-linux-x86_64</code><code>/bin/xtrabackup</code> <code>/usr/bin/xtrabackup</code>

ubuntu默认提供percona-xtrabackup工具,可以直接使用apt-get进行安装,apt-get -y install percona-xtrabackup。

<code>apt-get -y </code><code>install</code> <code>percona-xtrabackup</code>

ubuntu系统中使用apt-get安装percona-xtrabackup工具时会导致libmysqlclient18 mysql-common这两个包也会被安装(libaio1 libdbd-mysql-perl libdbi-perl libmysqlclient18 mysql-common percona-xtrabackup),mysql-common这个包会带进/etc/mysql/my.cnf,也许会导致service mysql {command}不能正常使用,可以将/etc/mysql/my.cnf改名或者将/etc/mysql目录改名,消除影响。如果数据库不是采用编译安装而是采用apt-get安装的话,则可以注意一下,看看是否有影响。

1.确定主从数据库上都正确配置了log-bin和分配了不同的server-id    

<code>egrep</code> <code>'(log-bin|server-id)'</code> <code>/etc/my</code><code>.cnf    </code>

<code>或    </code>

<code>grep</code> <code>-e </code><code>'(log-bin|server-id)'</code> <code>/etc/my</code><code>.cnf</code>

2.在主库服务器上使用innobackupex工具备份数据库并将数据库备份文件传输到从库机器的磁盘上

12

13

14

15

16

17

18

19

<code># for master    </code>

<code>apt-get </code><code>install</code> <code>percona-xtrabackup    </code>

<code>mv</code> <code>/etc/mysql/my</code><code>.cnf </code><code>/etc/mysql/my</code><code>.cnf~ || </code><code>mv</code> <code>/etc/mysql</code> <code>/etc/mysql</code><code>~    </code>

<code>service mysql status    </code>

<code># df -h    </code>

<code># du -sh /data/mysql/data     </code>

<code># 观察一下磁盘使用情况,以及/data/mysql/data mysql数据库数据目录的占用空间的大小,评估将这些文件scp到从库服务器的哪个位置等等    </code>

<code>cd</code> <code>/data</code>    

<code>mkdir</code> <code>-p </code><code>/data/mysql-master_data</code>    

<code># which innobackupex    </code>

<code># 为了避免ssh连接丢失,采用nohup执行    </code>

<code>nohup</code> <code>/usr/bin/innobackupex</code> <code>--user=root --password=password </code><code>/data/mysql-master_data</code> <code>&amp;    </code>

<code>#上述命令执行成功后会在/data/mysql-master_data目录下得到一个以时间格式生成的新目录的名字,如/data/mysql-master_data/2015-11-03_12-39-51    </code>

<code># make sure user privileges on scp target    </code>

<code># sshpass - noninteractive ssh password provider    </code>

<code>apt-get -y </code><code>install</code> <code>sshpass    </code>

<code># 为了避免ssh连接丢失,可以采用nohup执行    </code>

<code>sshpass -ppassword </code><code>scp</code> <code>-o stricthostkeychecking=no -p22 -r </code><code>/data/mysql-master_data</code> <code>[email protected]:</code><code>/data</code>    

<code>rm</code> <code>-rf </code><code>/data/mysql-master_data</code>

3.在从库服务器上使用innobackupex工具恢复从主库服务器得来的数据库备份文件    

<code># for slave    </code>

<code>#此处参考文章下面的“xtrabackup备份原理剖析”参考了解为什么需要apply-log    </code>

<code>innobackupex --apply-log </code><code>/data/mysql-master_data/2015-11-03_12-39-51</code>    

<code>#查看“/data/mysql-master_data/2015-11-03_12-39-51”内的xtrabackup_binlog_info文件,记录bin-log filename和pos值,以便切换master。    </code>

<code>service mysql stop    </code>

<code>#清空数据库数据目录    </code>

<code>rm</code> <code>-rf </code><code>/data/mysql/data/</code><code>*    </code>

<code>innobackupex --copy-back </code><code>/data/mysql-master_data/2015-11-03_12-39-51</code>    

<code>chown</code> <code>mysql:mysql -r </code><code>/data/mysql/data/</code>

4.配置从库,启用同步进程和观察结果    

<code>service mysql start    </code>

<code>mysql -uroot -ppassword    </code>

<code>#如果从库的my.cnf中设置了开启二进制日志,为了程序员的某些便利,启用log_bin_trust_function_creators,进一步了解可以参考下方的“mysql 函数限制”和“mysql创建方法错误:this function has none of deterministic, no sql”    </code>

<code>show variables like </code><code>'%func%'</code><code>;    </code>

<code>set global log_bin_trust_function_creators=1;    </code>

<code>change master to master_host=</code><code>'192.168.100.132'</code><code>,master_user=</code><code>'root'</code><code>,master_password=</code><code>'password'</code><code>,master_log_file=</code><code>'mysql-bin.000665'</code><code>,master_log_pos=51145611;    </code>

<code>start slave;    </code>

<code>show slave status \g;    </code>

<code>#注意观察slave_io_running: yes和slave_sql_running: yes,只有都是yes的时候才表示正确    </code>

<code># 如果原先主库上配置有event则需要在从库上停掉,毕竟从库不是用于做这个(含有写入操作)的    </code>

<code>show variables like </code><code>'event_scheduler'</code><code>;    </code>

<code>set global event_scheduler=0;    </code>

<code>quit;    </code>

<code>rm</code> <code>-rf </code><code>/data/mysql-master_data</code>    

<code># end</code>

<code># backup   </code>

<code>nohup</code> <code>/usr/bin/innobackupex</code> <code>--user=root --password=password</code><code>/data/mysql-master_data</code> <code>&amp;    </code>

<code>ls</code> <code>/data/mysql/data/</code> <code>-alh    </code>

<code>ls</code> <code>/etc/my</code><code>.cnf -l</code>

<code># recovery   </code>

<code>innobackupex --apply-log </code><code>/data/mysql-master_data/2015-11-03_11-21-10/</code>    

<code>innobackupex --copy-back </code><code>/data/mysql-master_data/2015-11-03_11-21-10/</code>    

<code>chown</code> <code>mysql:mysql -r </code><code>/data/mysql/data/</code>    

tag:mysql数据库主从配置,innobackupex 备份恢复数据库,xtrabackup备份恢复数据库,innobackupex 备份还原数据库,xtrabackup备份还原数据库

--end--