mydql数据备份

一、备份的目的

做灾难恢复:对损坏的数据进行恢复和还原

需求改变:因需求改变而需要把数据还原到改变以前

测试:测试新功能是否可用

二、备份需要考虑的问题

可以容忍丢失多长时间的数据;

恢复数据要在多长时间内完;

恢复的时候是否需要持续提供服务;

恢复的对象,是整个库,多个表,还是单个库,单个表。

三、备份的类型

1、根据是否需要数据库离线

冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;

温备(warm backup): 服务在线,但仅支持读请求,不允许写请求;

热备(hot backup):备份的同时,业务不受影响。

注:

1、这种类型的备份,取决于业务的需求,而不是备份工具

2、MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具

2、根据要备份的数据集合的范围

完全备份:full backup,备份全部字符集。

增量备份: incremental backup 上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份,备份的频率取决于数据的更新频率。

差异备份:differential backup 上次完全备份以来改变了的数据。

建议的恢复策略:

完全+增量+二进制日志

完全+差异+二进制日志

3、根据备份数据或文件

物理备份:直接备份数据文件

优点:

备份和恢复操作都比较简单,能够跨mysql的版本,

恢复速度快,属于文件系统级别的

建议:

不要假设备份一定可用,要测试

mysql>check tables;检测表是否可用

逻辑备份: 备份表中的数据和代码

优点:

恢复简单、

备份的结果为ASCII文件,可以编辑

与存储引擎无关

可以通过网络备份和恢复

缺点:

备份或恢复都需要mysql服务器进程参与

备份结果占据更多的空间,

浮点数可能会丢失精度

还原之后,缩影需要重建

四:备份的对象

1、 数据;

2、配置文件;

3、代码:存储过程、存储函数、触发器

4、os相关的配置文件

5、复制相关的配置

6、二进制日志

五、备份和恢复的实现

1、利用select into outfile实现数据的备份与还原

1.1把需要备份的数据备份出来

复制代码代码如下:

mysql> use hellodb;     //打开hellodb库

mysql> select * from students;  查看students的属性

mysql> select * from students where Age > 30 into outfile ‘/tmp/stud.txt‘ ;   //将年龄大于三十的同学的信息备份出来

注意:

备份的目录路径必须让当前运行mysql服务器的用户mysql具有访问权限

备份完成之后需要把备份的文件从tmp目录复制走,要不就失去备份的目的了

回到tmp目录下查看刚才备份的文件

[[email protected] ~]# cd /tmp

[[email protected] tmp]# cat stud.txt

3Xie Yanke53M216

4Ding Dian32M44

6Shi Qing46M5\N

13Tian Boguang33M2\N

25Sun Dasheng100M\N\N

[[email protected] tmp]#

你会发现是个文本文件。所以不能直接导入数据库了。需要使用load data infile 恢复

回到mysql服务器端,删除年龄大于30的用户,模拟数据被破坏

mysql> delete from students where Age > 30;

mysql> load data infile ‘/tmp/stud.txt‘ into table students;

2、利用mysqldump工具对数据进行备份和还原

mysqldump 常用来做温备,所以我们首先需要对想备份的数据施加读锁,

2.1 施加读锁的方式:

1.直接在备份的时候添加选项

--lock-all-tables 是对要备份的数据库的所有表施加读锁

--lock-table 仅对单张表施加读锁,即使是备份整个数据库,它也是在我们备份某张表的时候才对该表施加读锁,因此适用于备份单张表

2、在服务器端书写命令,

mysql> flush tables with read lock; 施加锁,表示把位于内存上的表统统都同步到磁盘上去,然后施加读锁

mysql> flush tables with read lock;释放读锁

但这对于InnoDB存储引擎来讲,虽然你也能够请求道读锁,但是不代表它的所有数据都已经同步到磁盘上,因此当面对InnoDB的时候,我们要使用mysql> show engine innodb status; 看看InnoDB所有的数据都已经同步到磁盘上去了,才进行备份操作。

2.2备份的策略:

完全备份+增量备份+二进制日志

演示备份的过程;

2.3 先给数据库做完全备份:

复制代码代码如下:

[[email protected] ~]# mysqldump -uroot --single-transaction --master-data=2 --databases hellodb > /backup/hellodb_`date +%F`.sql

--single-transaction: 基于此选项能实现热备InnoDB表;因此,不需要同时使用--lock-all-tables;

--master-data=2  记录备份那一时刻的二进制日志的位置,并且注释掉,1是不注释的

--databases hellodb 指定备份的数据库

然后回到mysql服务器端,

2.4回到mysql服务器端更新数据

复制代码代码如下:

mysql> create table tb1(id int); 创建表

mysql> insert into tb1 values (1),(2),(3);  插入数据,这里只做演示,随便插入了几个数据

2.5先查看完全备份文件里边记录的位置:

复制代码代码如下:

[[email protected] backup]# cat hellodb_2013-09-08.sql | less

-- CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000013‘, MASTER_LOG_POS=15684; 记录了二进制日志的位置

2.6 在回到服务器端:

复制代码代码如下:

mysql> show master status; 显示此时的二进制日志的位置

从备份文件里边记录的位置到我们此时的位置,即为增量的部分

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000004 |      15982 |              |                  |

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

2.7做增量备份

复制代码代码如下:

[[email protected] backup]# mysqlbinlog --start-position=15694 --stop-position=15982

/mydata/data/mysql-bin.000013 > /backup/hellodb_`date +$F_%H`.sql

2.8再回到服务器

复制代码代码如下:

mysql> insert into tb1 values (4),(5); 在插入一些数值

mysql> drop database hellodb;   删除hellodb库

2.9导出这次得二进制日志:

复制代码代码如下:

[[email protected] backup]# mysqlbinlog --start-position=15982 /mydata/data/mysql-bin.000013 查看删除操作时二进制日志的位置

[[email protected] backup]# mysqlbinlog --start-position=15982 --stop-position=16176 /mydata/data/mysql-bin.000013 > /tmp/hellodb.sql  //导出二进制日志

2.10先让mysql离线

回到服务器端:

复制代码代码如下:

mysql> set sql_log_bin=0;  关闭二进制日志

mysql> flush logs; 滚动下日志

2.11模拟数据库损坏

复制代码代码如下:

mysql> drop database hellodb;

2.12开始恢复数据:

复制代码代码如下:

[[email protected] ]# mysql < /backup/hellodb_2013-09-08.sql  //导入完全备份文件

[[email protected] ]# mysql < /backup/hellodb_2013-09-08_05.sql //导入增量备份文件

[[email protected] ]# mysql< hellodb.sql //导入二进制文件

验证完成,显示结果为我们预想的那样

注:

1、真正在生产环境中,我们应该导出的是整个mysql服务器中的数据,而不是单个库,因此应该使用--all-databases

2、在导出二进制日志的时候,可以直接复制文件即可,但是要注意的是,备份之前滚动下日志。

3、利用lvm快照实现几乎热备的数据备份与恢复

3.1策略:

完全备份+二进制日志;

3.2准备:

注:事务日志必须跟数据文件在同一个LV上;

3.3创建lvm Lvm的创建这里就不多说了,想了解话点击http://www.jb51.net/LINUXjishu/105937.html

3.4 修改mysql主配置文件存放目录内的文件的权限与属主属组,并初始化mysql

复制代码代码如下:

[[email protected] ~]# mkdir /mydata/data             //创建数据目录

[[email protected] ~]# chown mysql:mysql /mydata/data  //改属组属主

[[email protected] ~]#

[[email protected] ~]# cd /usr/local/mysql/    //必须站在此目录下

[[email protected] mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data  //初始化mysql

3.5修改配置文件:

复制代码代码如下:

vim /etc/my.cof

datadir=/mydata/data   添加数据目录

sync_binlog = 1  开启此功能

3.6 启动服务

复制代码代码如下:

[[email protected] mysql]# service mysqld start

mysql> set session sql_log_bin=0;  关闭二进制日志

mysql> source /backup/all_db_2013-09-08.sql   读取备份文件

3.7回到mysql服务器:

复制代码代码如下:

mysql> FLUSH TABLES WITH READ LOCK; 请求读锁

注:不要退出,另起一个终端:

mysql> SHOW MASTER STATUS;          查看二进制文件的位置

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

| mysql-bin.000004 |      107 |              |                  |

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

1 row in set (0.00 sec)

mysql> FLUSH LOGS;  建议滚动下日志。这样备份日志的时候就会很方便了

3.8导出二进制文件,创建个目录单独存放

复制代码代码如下:

[[email protected] ~]# mkdir /backup/limian

[[email protected] ~]# mysql -e ‘show master status;‘ > /backup/limian/binlog.txt

[[email protected] ~]#

3.9为数据所在的卷创建快照:

复制代码代码如下:

[[email protected] ~]# lvcreate -L 100M -s -p r -n mysql_snap /dev/myvg/mydata

回到服务器端,释放读锁

复制代码代码如下:

mysql> UNLOCK TABLES;

[[email protected] ~]# mount /dev/myvg/mysql_snap /mnt/data

[[email protected] data]# cp * /backup/limian/

[[email protected] data]#lvremove /dev/myvg/mylv_snap

3.10更新数据库的数据,并删除数据目录先的数据文件,模拟数据库损坏

复制代码代码如下:

mysql>  create table limiantb (id int,name CHAR(10));

mysql> insert into limiantb values (1,‘tom‘);

[[email protected] data]# mysqlbinlog --start-position=187 mysql-bin.000003 > /backup/limian/binlog.sql

[[email protected] backup]# cd /mydata/data/

[[email protected] data]#  rm -rf *

[[email protected] ~]# cp -a /backup/limian/* /mydata/data/

[[email protected] data]# chown mysql:mysql *

3.11测试

启动服务

复制代码代码如下:

[[email protected] data]# service mysqld start

[[email protected] data]# mysql 登陆测试

mysql> SHOW DATABASES;

mysql> SET sql_log_bin=0

mysql> source/backup/limian/binlog.sql; #二进制恢复

mysql> SHOW TABLES;         #查看恢复结果

mysql> SET sql_log_bin=1;   #开启二进制日志

注:此方式实现了接近于热备的方式备份数据文件,而且数据文件放在lvm中可以根据数据的大小灵活改变lvm的大小,备份的方式也很简单。

4、基于Xtrabackup做备份恢复

官方站点:www.percona.com

优势:

1、快速可靠的进行完全备份

2、在备份的过程中不会影响到事务

3、支持数据流、网络传输、压缩,所以它可以有效的节约磁盘资源和网络带宽。

4、可以自动备份校验数据的可用性。

安装Xtrabackup

复制代码代码如下:

[[email protected] ~]# rpm -ivh percona-xtrabackup-2.1.4-656.rhel6.i686.rpm

其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得

注意:在备份数据库的时候,我们应该具有权限,但需要注意的是应该给备份数据库时的用户最小的权限,以保证安全性,

4.1前提:

应该确定采用的是单表一个表空间,否则不支持单表的备份与恢复。

在配置文件里边的mysqld段加上

innodb_file_per_table = 1

4.2备份策略

完全备份+增量备份+二进制日志

4.3准备个目录用于存放备份数据

复制代码代码如下:

[[email protected] ~]# makdir /innobackup

4.4做完全备份:

复制代码代码如下:

[[email protected] ~]# innobackupex --user=root --password=mypass /innobackup/

注:

1、只要在最后一行显示 innobackupex: completed OK!,就说明你的备份是正确的。

2、另外要注意的是每次备份之后,会自动在数据目录下创建一个以当前时间点命名的目录用于存放备份的数据,那我们去看看都有什么

[[email protected] 2013-09-12_11-03-04]# ls

backup-my.cnf ibdata1 performance_schema xtrabackup_binary xtrabackup_checkpoints

hellodb mysql test xtrabackup_binlog_info xtrabackup_logfile

[[email protected] 2013-09-12_11-03-04]#

xtrabackup_checkpoints :备份类型、备份状态和LSN(日志序列号)范围信息;

xtrabackup_binlog_info :mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

xtrabackup_logfile :非文本文件,xtrabackup自己的日志文件

xtrabackup_binlog_pos_innodb :二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

backup-my.cnf :备份时数据文件中关于mysqld的配置

4.5回到mysql服务器端对数据进行更新操作

复制代码代码如下:

mysql> use hellodb;

mysql> delete from students where StuID>=24;

4.6增量备份

复制代码代码如下:

innobackupex --user=root --password=mypass --incremental /innobackup/--incremental-basedir=/innobackup/2013-09-12_11-03-04/

--incremental  指定备份类型

--incremental-basedir= 指定这次增量备份是基于哪一次备份的,这里是完全备份文件,这样可以把增量备份的数据合并到完全备份中去

4.7第二次增量

先去修改数据

复制代码代码如下:

mysql> insert into students (Name,Age,Gender,ClassID,TeacherID) values (‘tom‘,33,‘M‘,2,4);

innobackupex --user=root --password=mypass --incremental /innobackup/ --incremental-basedir=/innobackup/2013-09-12_11-37-01/

这里只须要把最后的目录改为第一次增量备份的数据目录即可

4.8最后一次对数据更改但是没做增量备份

复制代码代码如下:

mysql> delete from coc where id=14;

4.9把二进制日志文件备份出来,(因为最后一次修改,没做增量备份,要依赖二进制日志做时间点恢复)

复制代码代码如下:

[[email protected] data]# cp mysql-bin.000003 /tmp/

4.10模拟数据库崩溃

复制代码代码如下:

[[email protected] data]# service mysqld stop

[[email protected] data]# rm -rf *

恢复前准备

4.11对完全备份做数据同步

复制代码代码如下:

[[email protected] ~]# innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/

4.12对第一次增量做数据同步

复制代码代码如下:

innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/ --incremental-basedir=/innobackup/2013-09-12_11-37-01/

4.13对第二次增量做数据同步

复制代码代码如下:

innobackupex --apply-log --redo-only /innobackup/2013-09-12_11-03-04/ --incremental-basedir=/innobackup/2013-09-12_11-45-53/

--apply-log 的意义在于把备份时没commit的事务撤销,已经commit的但还在事务日志中的应用到数据库

注:

对于xtrabackup来讲,它是基于事务日志和数据文件备份的,备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据库文件中的事务,还应该对其做预处理,把已提交的事务同步到数据文件,未提交的事务要回滚。因此其备份的数据库,不能立即拿来恢复。

预处理的过程:

首先对完全备份文件只把已提交的事务同步至数据文件,要注意的是有增量的时候,不能对事务做数据回滚,不然你的增量备份就没有效果了。

然后把第一次的增量备份合并到完全备份文件内,

以此类推,把后几次的增量都合并到前一次合并之后的文件中,这样的话,我们只要拿着完全备份+二进制日志,就可以做时间点恢复。

4.14数据恢复

复制代码代码如下:

[[email protected] ~]# service mysqld stop

[[email protected] data]# rm -rf *  模拟数据库崩溃

[[email protected] ~]# innobackupex --copy-back /innobackup/2013-09-12_11-03-04/

--copy-back数据库恢复,后面跟上备份目录的位置

4.15检测:

复制代码代码如下:

[[email protected] ~]# cd /mydata/data/

[[email protected] data]# chown mysql:mysql *

[[email protected] data]#service mysqld start

时间: 2024-10-30 16:59:16

mydql数据备份的相关文章

bzoj1150 [CTSC2007]数据备份

Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一个办公楼

数据备份方案

经常有朋友发生了数据丢失时找我帮忙,我发现数据备份是最科学的解决方案.于是花时间把我这几年积累的数据备份方案整理出来,希望能帮到大家. 先看看几个典型情景: 我经常用手机拍照,万一我手机丢了,里面的照片的价值比一台新手机还大. 我把我的许多资料存在移动硬盘里了,结果今天硬盘出问题,读不出来,有什么办法可以挽回? 我的许多重要数据都存在我的个人电脑里,结果昨晚电脑被贼偷了. 我刚误修改了一份Excel文件,而且还保存了,我想要回修改前的文件. 以上是常见的几个代表情景,如果真的发生了,往往很难处理

Bzoj1150 数据备份Backup

Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公 楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网 络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味 着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一

rsync远程数据备份配置之再次总结

一.实验环境 主机名  网卡ip  默认网关 用途 nfs-server 10.0.0.11 10.0.0.254 rsync服务器端 web-client01 10.0.0.12 10.0.0.254 rsync客服端 web-client02 10.0.0.13 10.0.0.254 rsync客服端 二.实验步骤 1.什么是rsync?rsync是一款开源的,快速的,多功能的可实现全量及增量的数据备份同步的优秀工具,适用于多种操作系统之上.2.rsync特性1)支持拷贝链接文件特殊文件2)

mysql定时数据备份工具(c#)

此博文的出处 为 http://blog.csdn.net/zhujunxxxxx/article/details/40124773如果进行转载请注明出处.本文作者原创,邮箱[email protected],如有问题请联系作者 为了确保数据的安全,我们往往要对数据进行备份.但是为了减少我们的工作量,我写了一个简单的数据备份工具,实现定时备份数据库. 其实程序很简单,数据备份的工作就是几个mysql的命令而已. 先看看程序的运行界面 可以看到界面是十分的简单的 我们使用的是命令行来进行数据备份,

elasticsearch数据备份恢复

本文主要介绍elasticsearch集群数据备份及恢复,利用共享文件系统,通过快照方式备份. 集群的部署参考:http://hnr520.blog.51cto.com/4484939/1876467 一.配置修改 1.配置文件必须添加如下参数 path.repo:  /mnt/backups/es_mybak 二.数据备份 1.创建备份仓库 curl -XPUT 'http://192.168.115.11:9200/_snapshot/EsBackup' -d '{   "type"

linux 数据备份(NFS映射方法)

环境:Red Hat 4.8.3-9(主机) ip地址:192.168.1.1 Ubuntu 4.8.4-2(从机) IP地址:192.168.1.2 用途:将从机数据备份到主机,因从机空间较小,选择使用NFS网络磁盘映射的方法完成 NFS 是Network File System的缩写,即网络文件系统 [主机] 安装NFS服务 nfs-utils-* :包括基本的NFS命令与监控程序 portmap-* :支持安全NFS RPC服务的连接(该服务改名为rpcbind) #查看是否已安装该服务

Postgresql 数据库,如何进行数据备份以及导入到另外的数据库

方法其实有很多种,这里用的方法比较稳妥.之后有时间会补充别的方法. 该方法分为三步:备份数据,新建表结构,导入数据 备份数据:>>\copy table_name to '/home/bak/table_name.sql'; 新建表结构:把原来表结构的sql语句复制,删除没必要和不适应的信息,在新的数据库运行新建表语句. 导入数据:>>\copy table_name from '/home/bak/table_name.sql';

mysql中的数据备份与还原

一.有三种备份方式: 1. 数据表文件备份 2. 单表数据备份 3. SQL备份 4. 增量备份 二.mysql中的存储引擎 主要有两种:myisam 和 innodb. -- 免费的 其他收费的还有:BDB, Memory, Archive innodb的存储方式:表结构单独存放,所有数据都存储在ibdata1文件中. myisam的存储方式:表.数据和索引全部单独分开存储. 二.数据表文件备份与还原 直接复制数据库目录下的文件夹复制对应的表结构和数据文件,还原的时候直接放回去即可. 但是此方