Mysql备份与AB复制
复制有两种方式:同步复制(msylq-cluster) 异步复制(mysql-m/s主从备份又称作双机热备)
一、Mysql完全备份(冷备份方式和mysqldump工具)
1、冷备份方式:(必须得停掉mysql服务)
/etc/init.d/mysqld stop
将相关文件CP到别的地方,还原的时候需要将文件更改属主属组为mysql即可
/etc/init.d/mysqld start
2、mysqldump工具:
mysqldump -u root -p密码 test > /srv/test.sql (备份test数据库)
mysqldump -u root -p --all-databases > /srv/alldata.sql (备份所有的数据库)
恢复方式:mysql -u root -p密码 test < /srv/test.sql(导入test数据库)
mysql -u root -p密码 < /srv/alldata.sql(导入所有数据)
二、增量备份(使用时间来恢复和使用位置号来恢复)
mysql的增量备份使用的方法的是用过mysql的二进制日志来实现的,二进制日志中保存了对mysql的所有操作sql语句;mysql的二进制日志功能默认是关闭的,我们需要自己手动打开;
打开方式: vim /etc/my.cnf 添加
log-bin=binlog(开启binlog文件功能)
log-bin-index=binlog.index(建立binlog索引文件)
重新启动服务后就会在/var/lib/mysql 中发现binlog 二进制文件;
二进制的日志文件我们需要使用命令mysqlbinlog 来查看;
mysqlbinlog binlogfilename
1、使用时间来恢复:
例如:mysqlbinlog --start-date="2012-02-29 9:46:04" --stop-date="2012-02-29 13:47:24" /var/lib/mysql/binlog.000004 | mysql -u root
(对start和stop时间段的sql语句交给mysql执行,就能恢复这段时间的数据)
2、使用位置号来恢复:
例如:mysqlbinlog /var/lib/mysql/binlog.000001 4 --stop-position 185 | mysql -u root
(将binlog文件中at4到at185上一个at 的数据恢复到数据库中 以root身份执行)
三、Mysql的AB复制:(同步和异步复制)
原理: Master必须开启binlog功能
Slave通过I/O线程读到binlog文件并写入到relaylog文件
SQL线程会将relaylog文件重新执行到Slave的Mysql中.
在做AB复制之前一定要保证Master与Slave的数据是一样的,并且保证数据时Master给Slave.
主库master:192.168.18.51 从库slave:192.168.18.52
1、在master和slave上安装mysql
yum install mysql mysql-server -y (主从机都要安装mysql)
2、在master上修改/etc/my.cnf文件,添加
[mysqld]
server-id=1
#区别master和slave
log-bin=binlog
#启动二进制日志文件功能
log-bin-index=binlog.index
#添加二进制日志的索引文件
#binlog-do-db=test
#二进制文件需要同步的数据库名(不写为同步所有数据)
#binlog-ignore-db=mysql
#不同步mysql数据库数据,以免发生因同步了用户信息而从机出现登录问题
然后重启服务:service mysqld restart
3、授权给用户:
master登录数据库:
[root@kys1230 ~]# mysql
mysql> grant replication slave on *.* to 'k3'@'192.168.18.51' identified by "123";
mysql> flush privileges;
给主机192.168.18.51用户slave授权,密码123。
在从库slave上测试:
[root@zhy1230 ~]# mysql -uk3 -p123 -h 192.168.18.51
mysql>
OK正常登录,用户建立成功。
4、在slave上修改/etc/my.cnf文件,添加
[mysqld]
server-id=2
#从库ID号,和主库区别开
relay_lo =/var/lib/mysql/mysql-relay-bin
#开启slave上的relaylog功能
relay_log_index=/var/lib/mysql/mysql-relay-bin.index
#建立relaylog索引文件
5、在master上查看主库状态:
[root@kys1230 ~]# mysql
mysql> show master status \G;
*************************** 1. row ***************************
File: binlog.000002
Position: 1932
1 row in set (0.00 sec)
可以知道File(mysql-bin.000002),Position(1932)
这里需要注意一点 如果是生产环境可能数据库随时都有写的可能 就需要通过下面的命令锁定一下数据库之后做完操作在解锁
mysql> flush tables with read lock;
#锁定表不让写
mysql>unlock tables;
#解锁
6、在slave上查看从库状态:
[root@zhy1230 ~]# mysql
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='k3',master_password='123',master_log_file='mysql-bin.000002',master_log_pos=1932;
Query OK, 0 rows affected (0.13 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status \G;
Slave_IO_Running: Yes (从库I/O读写正常)
Slave_SQL_Running: Yes (从库mysql监听正常)
测试一下
[root@kys1230 ~]# mysql
mysql> create database lol;
[root@zhy1230 ~]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| lol |
| mysql |
| test |
+--------------------+
5 rows in set (0.00 sec)
OK已经过来了!