MySQL备份与AB复制

Mysql备份与AB复制

复制有两种方式:同步复制(msylq-cluster) 异步复制(mysql-m/s主从备份又称作双机热备)

一、Mysql完全备份(纯复制方式和mysqldump工具)

1、纯复制方式:(必须得停掉mysql服务)

/etc/init.d/mysqld stop

tar -zcvf mysql_backup.tgz /var/lib/mysql/

/etc/init.d/mysqld start

恢复方式:tar包解压覆盖原路径文件,缺点是不同版本数据不兼容

2、mysqldump工具:

mysqldump -uroot -p test > /srv/test.sql (备份test数据库)

mysqldump -uroot -p --all-databases > /srv/alldata.sql (备份所有的数据库)

恢复方式:mysql -uroot -p test < /srv/test.sql(导入test数据库)

mysql -uroot -p < /srv/alldata.sql(导入所有数据)

二、增量备份(使用时间来恢复和使用位置号来恢复)

mysql的增量备份使用的方法的是用过mysql的二进制日志来实现的,二进制日志中保存了对mysql的所有操作sql语句;mysql的二进制日志功能默认是关闭的,我们需要自己手动打开;

打开方式: vim /etc/my.cnf 添加

log-bin=noah 默认为log-bin=binlog;

重新启动服务后就会在/var/lib/mysql 中发现binlog 二进制文件;

二进制的日志文件我们需要使用命令mysqlbinlog 来查看;

1、使用时间来恢复:

例如:mysqlbinlog --start-date="2012-02-29 9:46:04" --stop-date="2012-02-29 13:47:24" /var/lib/mysql/binlog.000004 |mysql -uroot -pwestos (帐号root密码westos,对start和stop时间段的sql语句交给mysql执行,就能恢复这段时间的数据)

2、使用位置号来恢复:

例如:mysqlbinlog --start-position="106" --stop-position="1472" /var/lib/mysql/binlog.000003 |mysql -uroot -pwestos

注:时间和位置号都可以通过mysqlbinlog命令查看。

三、Mysql的AB复制:(同步和异步复制)

下面做单向热备实验:

主库master:192.168.0.57 从库slave:192.168.0.95

1、在master和slave上安装mysql

yum install mysql mysql-server -y (主从机都要安装mysql)

2、在master上修改/etc/my.cnf文件,添加

server-id=1 //区别master和slave

log-bin=mysql-bin //启动二进制日志文件功能

binlog-do-db=test //二进制文件需要同步的数据库名(不写为同步所有数据)

binlog-ignore-db=mysql //不同步mysql数据库数据,以免发生因同步了用户信息而从机出现登录问题

然后重启服务:service  mysqld restart

3、授权给用户:

master登录数据库:

[root@desktop57 ~]# mysql -uroot -pwestos

mysql> grant replication slave,reload,super on *.* to 'slave'@'192.168.0.95' identified by "10086";

mysql> flush privileges;

给主机192.168.0.95用户slave授权,密码10086。

在从库slave上测试:[root@desktop95 ~]# mysql -uslave -p10086 -h 192.168.0.57

OK正常登录,用户建立成功。

4、在slave上修改/etc/my.cnf文件,添加

server-id=2 //从库ID号,和主库区别开 (注意这一行的注释去掉,不然mysql起不来,可看日志)

master-host=192.168.0.57 //指定主库IP地址

master-user=slave //指定授权的用户名

master-password=10086 //指定授权用户的密码

replicate-do-db=test //要同步的数据库

replicate-ignore-db=mysql //忽略mysql数据库的同步

5、在master上查看主库状态:

[root@desktop57 ~]# mysql -uroot -pwestos

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |      571 | test         | mysql            |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

可以知道File(mysql-bin.000001),Position(571)

6、在slave上查看从库状态:

[root@desktop95 ~]# mysql -uroot -pwestos

mysql> slave stop;

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host='192.168.0.57',master_user='slave',master_password='10086',master_log_file='mysql-bin.000001',master_log_pos=571;  (指定从库应该备份的任务号,以slave用户登录密码10086)

Query OK, 0 rows affected (0.13 sec)

mysql> slave start;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G

......

Slave_IO_Running: Yes    (从库I/O读写正常)

Slave_SQL_Running: Yes    (从库mysql监听正常)

......

OK啦,没有的话就检查配置文件是否正确吧~~

我们测试一下看从库slave是否同步了master的数据呢?

[root@desktop57 ~]# mysql -uroot -pwestos

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| test               |

+--------------------+

3 rows in set (0.00 sec)

mysql> use test;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| grade          |

+----------------+

1 row in set (0.00 sec)

mysql> select * from grade;

+-------+-----+-------+--------+

| name  | num | grade | notes  |

+-------+-----+-------+--------+

| kevin | 14  | 98    | great! |

+-------+-----+-------+--------+

1 rows in set (0.01 sec)

OK,已经同步过来啦!!