MySQL(十二)

一、数据备份和恢复

数据备份是把文件或数据库从原来存储的地方复制到其他地方的活动,其目的是为了在设备发生故障或发生其他威胁数据安全的灾害时保护数据,将数据遭受破坏的程度减到最小。取回原先备份的文件的过程称为恢复数据。而备份的作用除了进行灾难恢复以外,还要用于审计及对备份数据做恢复测试等相关操作。

1、备份类型

根据备份时,数据库服务器是否在线:

  • 冷备:cold backup,此时数据库处于关闭状态,能够较好的保证数据库的完整性。
  • 温备:warm backup,将数据库执行写锁,在进行备份。
  • 热备:hot backup,数据库正处于运行状态,这种方法依赖于数据库的日志文件进行备份。

根据备份时的接口(直接备份数据文件还是通过mysql服务器导出数据):

  • 物理备份:physical backup,直接复制(归档)数据文件的备份方式;
  • 逻辑备份:logical backup,把数据从库中提出出来保存为文本文件;

根据备份时是备份整个数据还是仅备份变化的数据:

  • 完全备份(Full Backup)。这种备份策略的优点是当发生数据丢失的灾难时.可以迅速恢复丢失的数据。不足之处是每天都对整个系统进行完全备份.造成备份的数据大量重复。对于业务繁忙、备份时间有限的用户,选择这种备份策略是不明智的。
  • 增量备份(Incremental Backup)。先进行一次完全备份,在接下来的时间里只对当天新的或被修改过的数据进行备份。这种备份策略的优点是节省了磁盘空间,缩短了备份时间;缺点是当灾难发生时,数据的恢复比较麻烦.备份的可靠性也很差。
  • 差分备份(Differential Backup)。先进行一次系统完全备份,在接下来的几天里.再将当天所有与备份不同的数据(新的或修改过的)备份到磁盘上。差分备份策略在避免了以上两种策略的缺陷的同时.又具有了其所有优点。首先,它无须每天都对系统做完全备份,因此所需的备份时间短,并节省了磁盘空间。其次,它的灾难恢复也很方便.一旦发生问题,用户只需使用完全备份和发生问题前一天的备份就可以将系统恢复。

2、 备份策略

  • 选择备份方式
  • 选择备份时间
  • 考虑到恢复成本
  • 恢复时长
  • 备份成本
  • 锁时间
  • 备份时长
  • 备份负载

3、备份对象

  • 数据
  • 配置文件
  • 代码:存储过程,存储函数,触发器
  • OS相关的配置文件,如crontab配置计划及相关的脚本

二、MySQL备份工具

1、常见的备份工具

  • mysqldump

mysqldump是一个安装mysql数据库后自动带的一个备份工具,这是一个逻辑备份工具,能支持InnoDB引擎数据的热备、MyISAM引擎数据的温备、Aria引擎数据的温备。由于是逻辑备份工具故其备份和恢复过程较慢。由于其在执行任务时是单线程的,故其性能较差。还有一个多线程版本的工具mysqldumper,使用此工具在备份多张库或者表时能够比mysqldump有更好的性能。同时这两种工具很难实现自动差异或增量备份,若需要此类备份需要人工手动执行。最后若你的数据量一旦超过5G就不建议使用此工具。

  • 基于lvm-snapshot的备份

由于其是一个逻辑卷快照故这种备份接近于热备的工具,工作流程是要先请求全局锁,而后创建快照,并在创建快照完成后释放全局锁, 然后使用cp、tar等工具进行物理备份。这种方法备份和恢复速度较快,同时很难实现增量备份,并且请求全局需要等待一段时间,在繁忙的服务器上尤其如此。最后能够使用此种备份是基于你的数据是放在逻辑卷上的。

  • 基于SQL语句的备份

在mysql的交互式接口执行SELECT clause INTO OUTFILE ‘/path/to/somefile‘;语句就可以将指定的数据保存在linux系统上有权限进行写入操作的目录中。若想恢复就执行LOAD DATA INFILE ‘/path/from/somefile‘;语句。部分备份工具, 不会备份关系定义,仅备份表中的数据。同时也是逻辑备份工具,速度略快于mysqldump。

  • innobackup

这是Innobase公司所提供的商业备份工具,能够实现InnoDB引擎数据的热备,增量备份。MyISAM引擎数据的温备,但不支持增量。由于其是物理备份工具,故速度快。

  • Xtrabackup

这是一款 由Percona提供的开源备份工具,能够实现InnoDB引擎数据的热备,增量备份。MyISAM引擎数据的温备,但不支持增量。由于其是物理备份工具,故速度快。

2、mysqldump工具介绍

语法:mysqldump [options] [db_name [tbl_name ...]]

注意:在使用基于mysqldump工具备份的数据执行恢复操作时,如果目标库不存在,需要事先手动创建 。

常用选项:

  • --all-databases:备份所有库;
  • --databases db1 db2 ...:备份指定的多个库;
  • --lock-all-tables:请求锁定所有表之后再备份,对MyISAM、InnoDB、Aria做温备;
  • --single-transaction: 能够对InnoDB存储引擎实现热备;
  • --flush-logs:备份前、请求到锁之后滚动日志;
  • --master-data=[0|1|2]:复制时的同步位置标记,0: 不记录、1:记录为CHANGE MASTER语句、2:记录为注释的CHANGE MASTER语句

备份代码:

  • --events:备份事件调度器代码;
  • --routines:备份存储过程和存储函数 ;
  • --triggers:备份触发器;

3、使用mysqldump备份流程

备份前的准备:

  • 请求锁:--lock-all-tables或使用--singe-transaction进行innodb热备;
  • 滚动日志:--flush-logs
  • 选定要备份的库:--databases
  • 记录二进制日志文件及位置:--master-data=

恢复:

  • 建议:关闭二进制日志,关闭其它用户连接;

4、基于数据库的备份

查看此库的所有表,然后发现这些表是基于MyISAM引擎存储的,故使用温备的方法。

MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| stu               |
| students          |
| teachers          |
| toc               |
+-------------------+
8 rows in set (0.00 sec)

备份数据库:

[[email protected] ~]# mysqldump -uroot -hlocalhost -p --databases hellodb --lock-all-tables --flush-logs --master-data=2 > /tmp/hellodb.1.sql
Enter password: 
[[email protected] ~]# ls -lh /tmp/hellodb.1.sql 
-rw-r--r-- 1 root root 9.3K 9月   1 09:06 /tmp/hellodb.1.sql

在备份文件中查看二进制文件的滚动信息注意尽量不要用vim等文本工具打开备份文件:

[[email protected] ~]# head -30 /tmp/hellodb.1.sql
-- CHANGE MASTER TO MASTER_LOG_FILE=‘master-bin.000002‘, MASTER_LOG_POS=353;

更新hellodb数据库中的内容:

MariaDB [hellodb]> CREATE TABLE newtb(Name CHAR(30));
Query OK, 0 rows affected (0.04 sec)

MariaDB [hellodb]> INSERT INTO newtb VALUES(‘bols‘),(‘longls‘);
Query OK, 2 rows affected (0.07 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [hellodb]> SELECT * FROM newtb;
+--------+
| Name   |
+--------+
| bols   |
| longls |
+--------+
2 rows in set (0.00 sec)

误删数据库:

MariaDB [mysql]> DROP DATABASE hellodb;
Query OK, 9 rows affected (0.06 sec)

根据备份文进行恢复操作:

恢复前要先让服务器离线,然后查看二进制日志将在我们完整备份时看到的终点是353,而664是为删除数据库前的那一时刻。

[[email protected] ~]# mysqlbinlog --start-position=353 --stop-position=664 /data/binlog/master-bin.000002 > /tmp/hellodb.1.inc.sql

恢复操作:

MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |    10299 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> FLUSH LOGS;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000004 |      367 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

关闭二进制日志的记录功能:

MariaDB [(none)]> SET SESSION sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

导入数据:

MariaDB [(none)]> SOURCE /tmp/hellodb.1.sql;
Query OK, 0 rows affected (0.00 sec)

发现在完整备份后的数据没有恢复:

MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| stu               |
| students          |
| teachers          |
| toc               |
+-------------------+
8 rows in set (0.00 sec)

恢复完整备份后的数据:

MariaDB [hellodb]> SOURCE /tmp/hellodb.1.inc.sql
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| newtb             |
| scores            |
| stu               |
| students          |
| teachers          |
| toc               |
+-------------------+
9 rows in set (0.00 sec)

恢复完毕:

MariaDB [hellodb]> SELECT * FROM newtb;
+--------+
| Name   |
+--------+
| bols   |
| longls |
+--------+
2 rows in set (0.00 sec)

开启记录二进制日志功能:

MariaDB [hellodb]> SET SESSION sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

以上就是基于mysqldump 备份+二进制日志进行的数据恢复,在生产环境中二进制日志和数据是分开存放的,同时二进制日志最好建在有冗余功能的设备上。我们在备份时不管只是简单的备份数据,同时还要备份二进制日志文件和相关的配置文件等,对MySQL配置文件,以及与MySQL相关的OS配置文件在每次修改后都应该直接进行备份。所以在日常中工作备份策略一定要做的健壮,以免造成不必要的损失!

三、如何使用shell脚本实现mysql全量,增量备份。

增量备份在周一-周六凌晨3点,会复制mysql-bin.00000*到指定目录;

而全量备份则使用mysqldump将所有的数据库导出,每周日凌晨3点执,并会删除上周留下的mysq-bin.00000*。然后对mysql的备份操作会保留在bak.log文件中。

实现脚本创建,脚本是在这个人的博客上找的:http://sohudrgon.blog.51cto.com/3088108/1607396

1、编写全量备份脚本

[[email protected] ~]# vim DBfullybak.sh
#!/bin/bash
# Program
# use mysqldump to Fully backup mysql data per week!
# History
# 2015-01-22 guo
# Path
BakDir=/backup
LogFile=/backup/bak.log
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
/usr/local/mysql/bin/mysqldump -uroot -poracle --quick --all-databases --flush-logs --delete-master-logs --single-transaction > $DumpFile
/bin/tar czvf $GZDumpFile $DumpFile
/bin/rm $DumpFile
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFile
cd $BakDir/daily
rm -rf *

2、编写增量备份脚本

[[email protected] ~]# vim DBdailybak.sh
#!/bin/bash
# Program
# use cp to backup mysql data everyday!
# History
#2015-01-22 guo
# Path
BakDir=/backup/daily
BinDir=/mydata/data
LogFile=/backup/bak.log
BinFile=/mydata/data/mysql-bin.index
/usr/local/mysql/bin/mysqladmin -uroot -poracle flush-logs
#这个是用于产生新的mysql-bin.00000*文件
Counter=`wc -l $BinFile |awk ‘{print $1}‘`
NextNum=0
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的。
for file in  `cat $BinFile`
do
        base=`basename $file`
        #basename用于截取mysql-bin.00000*文件名,如去掉./mysql-bin.000005前面的./
        NextNum=`expr $NextNum + 1`
        if [ $NextNum -eq $Counter ]
        then
                echo $base skip!  >> $LogFile
        else
                dest=$BakDir/$base
                if (test -e $dest)
                #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去。
                then
                        echo  $base exist! >> $LogFile
                else
                        cp $BinDir/$base $BakDir
                        echo $base copying >> $LogFile
                fi
        fi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $LogFile

3、设置计划任务每天执行

# crontab -l //内容为下
#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /root/DBfullybak.sh >/dev/null 2>&1
#周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /root/DBdailybak.sh >/dev/null 2>&1
时间: 2024-10-03 09:14:53

MySQL(十二)的相关文章

十二、mysql sql_mode 简学

1.一般默认情况下sql_mode默认为空,也就是不严格的sql检查 2.如果sql_mode为空的情况下,测试: create table tt3 (name char(2)); //定义一个name字段长度为定长2的tt3表 insert into tt3 values ('wo'); //正常插入,无措 insert into tt3 values ('woshi'); //正常插入,但值已被截取成了“wo” 修改sql_mode为严格模式: set session sql_mode =

我的MYSQL学习心得(十二)

原文:我的MYSQL学习心得(十二) 我的MYSQL学习心得(十二) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL学习心得(五) 我的MYSQL学习心得(六) 我的MYSQL学习心得(七) 我的MYSQL学习心得(八) 我的MYSQL学习心得(九) 我的MYSQL学习心得(十) 我的MYSQL学习心得(十一) 这一篇<我的MYSQL学习心得(二)>将会讲解MYSQL的触发器 触发器是一个特殊的存储过程,不

进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量.所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来

Mysql学习之十二:JDBC连接数据库之DriverManager方法

JDBC连接数据库 ?创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ Sy

Python开发【第十八篇】:MySQL(二)

Python开发[第十八篇]:MySQL(二) 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( SELECT nid, NAME FROM tb1 WHERE nid > 2 ) AS A WHERE A. NAME > 'alex'; 临时表搜索 1.创建视图 --格式:CREATE VIEW 视图名称 AS SQL语句 CREATE VIEW v

Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇)

目录 Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 1 Internal Locking Methods 2 Metadata Locking 3 External Locking Mysql优化(出自官方文档) - 第十二篇(优化锁操作篇) 1 Internal Locking Methods 这里介绍Mysql的几种锁,该锁由Mysql自行进行管理,用户不需要处理该锁. Row-Level Locking 对于InnoDB,行锁可以通过SELECT ... FOR UPDAT

Heroku创始人Adam Wiggins发布十二要素应用宣言

Heroku是业内知名的云应用平台,从对外提供服务以来,他们已经有上百万应用的托管和运营经验.前不久,创始人Adam Wiggins根据这些经验,发布了一个“十二要素应用宣言(The Twelve-Factor App)”,该宣言由国内工作于安居客的程序员梁山将其翻译为中文,InfoQ中文站摘录如下. 十二要素应用宣言 简介: 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或“软件即服务”(SaaS).“十二要素应用程序”(12-Factor App)为构建如下的SaaS应用提供了

十二年IT职业生涯心得--致我们终将逝去的青春(连载)

章节001最近老婆带儿子回娘家住一段时间,一个人无聊的很,回到家安静的屋子让人很不适应.正好赶上世界杯,到家就把电视开开弄点动静出来,周末赛事熬了几个通宵.也趁着这"自由"的时间给自己写写总结! 话说long long ago专科毕业后雄心勃勃地去了当时业内号称的电脑公司工作,觉得凭自己的能力在电脑城能做出点名堂,而这一做就三年多.做的最多的就是接货送货(各种CRT显示器,各种主板,显卡,机箱,电源),拧螺丝,组装(给网吧装电脑的话一装就百来台,RJ45水晶头熟练到几乎闭着眼都能做),

hbase 学习(十二)集群间备份原理

集群建备份,它是master/slaves结构式的备份,由master推送,这样更容易跟踪现在备份到哪里了,况且region server是都有自己的WAL 和HLog日志,它就像mysql的主从备份结构一样,只有一个日志来跟踪.一个master集群可以向多个slave集群推送,收到推送的集群会覆盖它本地的edits日志. 这个备份操作是异步的,这意味着,有时候他们的连接可能是断开的,master的变化不会马上反应到slave当中.备份个格式在设计上是和mysql的statement-based

寒假阅读笔记十二

架构之美--最终用户应用架构(二) 今天,我阅读的是<架构之美>的第十二章,这一章主要讲的是Akonadi框架,让我充分了解了Akonadi框架是什么?怎么用? kde 4.1中的Akonadi是一个以mysql为存储管理的 KDE 4 存储接口.它分为两个部分,一个称之为 Akonadi服务器,一个是为用户程序提供的和Akonadi服务器打交道的库,Akonadi服务器是单独提供的程序,属于kde的支持部分的一个软件.用户库包含在kdepimlibs之中.Akonadi目前的主要应用是做为k