数据库作为我们的日常工作中不可缺少的部分,那它内部数据的重要性显而易见,所以数据安全至关重要。确保数据的安全,我们就必须做好数据备份。简单说几个MySQL常用的备份工具以及如何利用这些工具实现数据的备份。
一:MySQL自带的工具---mysqldump,相信大家应该还有映像:# ls /usr/local/mysql/bi我们会看到此命令。
用法:mysqldump [options] [db_name [tbl_name ...]]
常用选项:
--databases --备份数据库,后面可以跟某个数据库的名称
--all-databases ---备份所有数据库
--lock-all-tables --->请求锁定所有表再备份,写操作会被阻塞
--lock-tables --->锁定某张表
--single-transaction --->能够对innodb存储引擎实现热备 可以不用--lock-all-tables.对MyISAM、Aria做温备
--events --->备份事件调度器代码
--routines --->备份存储过程,存储函数
--triggers --->备份触发器
--flush-logs --->备份前、请求到锁之后滚动日志
--master-data=[0|1|2] 记录二进制日志文件名及事件发生时所处的位置。0:表示不记录,1:记录为change master语句,2:记录为注释change master语句
2:利用mysqldum实现备份机制:
首先:请求锁定要备份的部分,如果使用--single-transaction可以不用请求锁
其次:滚动二进制日志
然后:选择要备份的库
记录二进制日志文件的内容,记录开始备份的二进制日志的文件名,以及其备份到那个位置结束的。
3:具体实施步骤:先做一次完全备份。
先看看原始数据库
备份: # mysqldump --all-databases --lock-all-tables --flush-logs --master-data=2 > /tmp/mysql.sql
删除数据库:
恢复数据库
其实部分数据库的备份也是如此只是命令稍作修改
--all-databases 换作--databases 后面跟上你要备份的数据库名,多个数据库名之间空格隔开。 例如: # mysqldump --databases --lock-all-tables mydb test --flush-logs --master-data=2 > /tmp/mysql.sql
如果我们的数据库使用的存储引擎是innoDB那么我们可以不使用--lock-all-tables这个选项,锁表,只是为了不让我们在备份的时候别人正在修改数据数据。导致我们的备份出现变化。而是使用--single-transaction。这样我们在备份的时候别人也可以做写操作,而且还不影响我们的数据备份。
# mysqldump --databases --single-transaction mydb test --flush-logs --master-data=2 > /tmp/mysql.sql
--fulsh-logs:滚动日子的目的是为了记录备份以后到下次备份之间数据改变的操作,以便我们在某一时刻数据库损坏还原的时候可以还原到最后一次数据改变的那个时刻。
我们可以演示一下mysqldump+二进制日志文件,做即时点还原数据。
数据库的还原我们已经做过,在此基础上我们做基于二进制日志文件的即时点还原数据。
首先:查看当前二进制日志文件的文件名称及其位置:
其次:我们做一些修改数据的操作
MariaDB [hellodb]> CREATE DATABASE Linux;
MariaDB [hellodb]> use Linux;
MariaDB [Linux]> CREATE TABLE student (Name char(30), Age int);
接着:我们手动滚动下二进制日志
模拟:数据库损坏,我们删除刚创建的数据库文件
导出,刚才我们在做数据修改之后到删除数据库之前的二进制日志文件内容,因为我们在数据库删除之前滚动了二进制日志,所有者使用mysqlbinlog命令的时候不需要指定结束位置,只需要指定开始位置即可
# mysqlbinlog --start-position=525815 /mydata/master/master-bin.000004 > /tmp/000004bin.sql
最后:我们开始还原数据:
我们在恢复数据的时候也会产生二进制日志文件,但是这些是没有必要记录在二进制日志文件中的,所以我们在恢复数据的时候最好是先手动关掉二进制日志文件,然后再进行备份还原,还原完成后再启动二进制日志。
set session sql_log_bin=0;
set session sql_log_bin=1;
注意:在利用mysqldump备份单个数据库的时候可以不使用--database 选项,如果不使用,在还原的时候如果你还原的数据库文件不存在,就需要手动创建此数据库文件。
二:lvm-snapshot:基于LVM快照的备份,但是这有个前提,事务日志与数据文件必须在同一卷上。这样我们做快照的时候可以让数据文件跟日志文件的快照基于同一时刻。
基于快照实现备份还原的思路:
首先:我们也是先要做请求全局锁,禁止用户的写操作,防止数据改变。
其次:锁定表以后,我们要滚动二进制日志,为了便于实现即时点还原
然后:做二进制日志文件的名称和位置标记
接着:做快照
最后:释放全局锁
有了这些思路,那我们来实操演练:
1:请求全局锁 MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
2:手动滚动二进制日志文件 MariaDB [(none)]> flush logs;
3:记录二进制日志文件名及其当前事件所处的位置
# mysql -e 'show master status;' > /tmp/000004.sql
4:创建快照 lvcreate -L 100M -s -n mydata-snap -p r /dev/mydb/mydata
5:释放全局锁 MariaDB [(none)]> UNLOCK TABLES;
6:挂载快照,并备份数据
mount /dev/myvg/mydata-snap /mnt -o ro
cp /mnt/* /tmp/mydb.back -a
7:卸载挂载,并删除快照。
8:停止服务并模拟数据库损坏
9:还原数据并启动mysql服务
10:基于二进制日志文件的即时点还原与mysqldump一致。我们就不再做演示。
三:基于Xtrabackup进行MySQL备份
yum安装Xtrabackup软件,因为有依赖关系。
使用innobackupex备份需要注意以下两点:
1:要使用高级的备份机制,必须使用独立的表空间结构,所以需要在配置文件中定义启动独立表空间。
# vim /etc/my.cnf
2:innobackupex只支持对innoDB做热备,MyISAM只是复制
实操演练:
首先:创建备份文件存放目录
# mkdir /mybackup
其次:出于安全考虑创建只具有备份权限的账号
然后:开始备份
最后:还原
本文出自 “欢迎大家来做客” 博客,请务必保留此出处http://aperson.blog.51cto.com/3480661/1433018