MySQL的备份和恢复-mysqldump

                                          作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.为什么需要备份
1>.做灾难恢复
  天有不测风云嘛,如果你的服务器被黑客攻击了(比如现在比较流行的比特币病毒),或是你的新同事手一哆嗦不小心删除了一个生产上的数据库,你们boss找你们技术总监解决问题,你发现你的新同事时跑路了,这个时候你就得感激你的备份啦!
2>.做审计
  比如一个开发想要知道某一个数据在过去的某一时刻是什么样子的,这个时候你的备份就又一次可以大显身手啦!
3>.测试
  比如MySQL想从5.1升级到5.5版本。当你升级的时候失败时,你可以进行恢复操作等等。
  备份的目的是用于恢复,对备份数据做恢复测试是很有必要的。这样你参会知道你的备份内容是否有效,如果发现备份的内容无效的话,赶紧重新备份,不然如果生成环境哪天真出了事情,将会带来不可挽回的地步哟!尤其是电商平台,备份的相当有必要的!如果哪天数据库奔溃了你无法恢复这不仅仅意味着你的饭碗会丢,还会导致公司造成巨额损失。
二.备份类型
1>.根据备份时,数据库服务器是否在线
  冷备(cold backup)
    需要服务器离线,这就意味着数据的读写操作都不能进行啦,对运维来讲,这是最安全的备份方式但也是最不靠谱的备份方式哟!不能因为备份就让服务下线,这样会映像客户体验的,你想想,淘宝网如果说采用这种方式,那全天下的妹纸们不都得找马云撒娇去啦!

  温备(warm backup)
    全局施加共享锁,只能读,不能写。这种方式服务器不需要离线,只是限制了写操作。

  热备(hot backup)
    服务器不需要离线,用户也可以进行读写操作。这种备份方式不会影响正常的业务,且保证数据的备份的时间点都是一致的。这种备份方式需要基于事物的支持哟!
2>.根据备份的数据集:
  完全备份(full backup)
    它会备份整个数据库。

  部分备份 (partial backup)
    它可能只会备份某个库的部分数据,比如某张表或是一张表中的部分数据。
3>.根据备份时的接口(直接备份数据文件还是通过mysql服务器导出数据)
  物理备份(Physical backup)
    直接复制(归档)数据文件的备份方式.说白了这种方式就是一个复制操作,我们只要使用tar命令和cp命令来协助我们完成本分即可。因此它不需要其他工具来帮助我们来备份。恢复起来也很简单,直接将数据解压到数据目录中去即可,但是可能存在版本兼容的问题(和存储引擎有关)哟,因此这种跨平台方式就相对逻辑备份要查很多呢。如果数据量大的话,这个时候逻辑备份的效率就会显得很低,因此建议使用物理备份。

  逻辑备份(Logical backup)
    把数据从库中提取出来保存为文本文件.我们可以使用mysqldump来进行备份。
    逻辑备份的优点:可以基于网络恢复,且我们可以用cat,grep等命令来查看文件的内容。这种方式备份跟存储引擎无关,我们可以通过sed命令对这个文本文件进行修改默认的存储引擎等等,有助于备份数据损坏。
    逻辑备份的缺点:它恢复速度回比物理备份要满,且占用空间相对较大。最致命的一点就是无法完整保存浮点数的精度,更重要的是基于这种恢复方式需要你自己重建索引,如果恢复的数据较多时,重建索引又是一个令人头疼的问题
4>.根据备份时是备份整个数据还是仅备份变化的数据
  完全备份(full backup)
    顾名思义,将整个数据库都备份出来。建议每周做一次完全备份。

  增量备份(incremental backup)
    我们使用这种方式较多一点,和上一次备份对比,只备份修改过的内容。建议每天做一次增量备份。优点就是占用空间小。
  
  差异备份(differential backup)
    从上一个完全备份开始备份,当我们想要恢复数据时,只需要最近一天的备份即可,很明显,差异备份占据的空间肯定是要比增量备份要大的。
三.备份策略
  备份策略我们可以通过以下几个角度去思考:
    1>.选择备份方式(推荐物理备份)
    2>.选择备份时间(推荐凌晨2~3点)
    3>.考虑到恢复成本(需要考虑恢复时长)
    4>.考虑备份成本( 锁时间, 备份时长,备份负载)
四.备份对象
  1>.数据;
  2>.MySQL的配置文件;
  3>.代码(存储过程、存储函数、触发器);
  4>.OS相关的配置文件,如crontab配置计划及相关脚本;
  5>.跟复制相关的配置信息(二进制日志文件,尤其是主从同步的场景);
 
 
五.常用的备份工具简介
1>.mysqldump(单线程)
  它是一个逻辑备份工具,可以对不同的存储引擎实现不同的备份机制,如,支持:InnoDB热备、MyISAM温备、Aria温备。备份和恢复过程较慢,因为它是单线程的备份工具。数据大于10G以上不建议使用这个备份工具,因为效率太低啦!
2>.mysqldumper 
  它也是一个逻辑备份工具,相比mysqldump而言,它用时更短,你可以理解它是多线程的mysqldump。但是很难实现差异或增量备份
3>.基于lvm-snapshot
  接近于热备的工具,因为要先请求全局锁,而后创建快照,并在创建完成后释放全局锁,使用cp、tar等工具进行物理备份。它的特点是备份和恢复速度较快,但是缺点就是很难实现增量备份,并且请求全局锁需要等待一段时间,在繁忙的服务器上尤其如此。
4>. 部分备份工具
  SELECT clause INTO OUTFILE ‘/path/to/somefile’ 
    #将数据备份到本地文件
  LOAD DATA INFILE ‘/path/from/somefile’
    #将数据从本地文件中恢复回来
  
  它是个逻辑备份工具,快于mysqldump,部分备份工具,不会备份关系定义,仅备份表中的数据.无法实现增量备份。
5>.Innobase
  它是商业备份工具,innobackup。
6>.Xtarbackup
  由Percona提供的开源备份工具。支持InnoDB热备且支持增量备份,MyISM温备且不支持增量备份。它属于物理备份类型,备份和恢复的速度很快。
7>.mysqlhotcopy
  这是MySQL自带的工具,很遗憾的是它几乎冷备工具。因此它用的很少。
六.mysqldump的应用
  mysqldump其实就是MySQL客户端的一个工具,也就是说,你的MySQL服务器和你的mysqldump可以在不同的主机上,从而实现远程备份的方式。适合备份较小的数据,如果数据内容在5~10G之间的话,采用mysqldump的本分方式是再好不过的啦。
1>.备份单个数据库使用格式,恢复时需要提前创建数据库
  mysqldump [options] [db_name [tbl_name ...]]
 常用参数:
    -u uername
    -h 主机名
    -p 密码
 [root@yinzhengjie ~]# mkdir -p /yinzhengjie/mysql/backup        #创建备份的数据库目录
[root@yinzhengjie ~]# mysqldump -uroot -h127.0.0. -p yinzhengjie > /yinzhengjie/mysql/backup/yinzhengjie.sql #将数据库的“yinzhengjie”这个库进行备份
Enter password:
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# ls -l /yinzhengjie/mysql/backup/
total
-rw-r--r--. root root Nov : yinzhengjie.sql
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# mysql -pyinzhengjie #登录数据库,我们来搞事情
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.1. Source distribution Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysql> use yinzhengjie
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>
mysql> select database();
+-------------+
| database() |
+-------------+
| yinzhengjie |
+-------------+
row in set (0.00 sec) mysql> show tables;
+-----------------------+
| Tables_in_yinzhengjie |
+-----------------------+
| Classes |
| students |
| tearchers |
+-----------------------+
rows in set (0.00 sec) mysql> drop database yinzhengjie;
Query OK, rows affected (0.48 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
rows in set (0.00 sec) mysql> \q
Bye
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# mysql -pyinzhengjie -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
[root@yinzhengjie ~]# mysql -pyinzhengjie -e "create database yinzhengjie;" #我们现在要做的是创建出库名,方便我们一会导入。
[root@yinzhengjie ~]# mysql -pyinzhengjie -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| yinzhengjie |
+--------------------+
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# mysql -pyinzhengjie yinzhengjie < /yinzhengjie/mysql/backup/yinzhengjie.sql #这里是进行恢复数据的操作,注意,需要指定库名哟!
[root@yinzhengjie ~]# mysql -pyinzhengjie
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.1. Source distribution Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use yinzhengjie
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_yinzhengjie |
+-----------------------+
| Classes |
| students |
| tearchers |
+-----------------------+
rows in set (0.00 sec) mysql>
2>.备份所有的数据库
  需要用到参数: --all-databases
 [root@yinzhengjie ~]# mysqldump -uroot -h127.0.0. -p --all-databases > /yinzhengjie/mysql/backup/all_databases.sql
Enter password:
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
[root@yinzhengjie ~]# ll /yinzhengjie/mysql/backup/
total
-rw-r--r--. root root Nov : all_databases.sql
-rw-r--r--. root root Nov : yinzhengjie.sql
[root@yinzhengjie ~]#
3>.备份指定的数据库
 需要用到的参数:--databases
[root@yinzhengjie ~]# mysqldump -uroot -h127.0.0. -p --databases mysql yinzhengjie > /yinzhengjie/mysql/backup/custom.sql #只备份mysql和yinzhengjie这两个数据库
Enter password:
-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# ll /yinzhengjie/mysql/backup/
total
-rw-r--r--. root root Nov : all_databases.sql
-rw-r--r--. root root Nov : custom.sql
-rw-r--r--. root root Nov : yinzhengjie.sql
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# mysql -pyinzhengjie -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| yinzhengjie |
+--------------------+
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# mysql -pyinzhengjie -e 'drop database mysql;' #删库操作
[root@yinzhengjie ~]# mysql -pyinzhengjie -e 'drop database yinzhengjie;'
[root@yinzhengjie ~]# mysql -pyinzhengjie -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# mysql -pyinzhengjie < /yinzhengjie/mysql/backup/custom.sql #恢复库的操作
[root@yinzhengjie ~]# mysql -pyinzhengjie -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| yinzhengjie |
+--------------------+
[root@yinzhengjie ~]#
4>.备份前要加锁
  请求锁定所有表之后在备份,对MyISAM,InnoDB,Aria做温备
    以上的3中备份方式在生产环境中并不适用,我们知道生产上的数据库可能随时都在和用户进行交互,如果我们用以上的方式备份肯定会存在问题。因为我们在备份的同时如果有人往里面写入数据了,可能拿到的结果和生产上的结果是不一致的,因此,我们在备份的时候可以添加写锁。即“[root@yinzhengjie ~]# mysqldump -pyinzhengjie --databases yinzhengjie --lock-all-tables > /yinzhengjie/mysql/backup/yzj.sql”,但是这种备份方式并不理想,因为在备份期间会导致所有的数据请求都会被阻塞住。

  对InnoDB存储引擎实现热备
    只要你能确认你的库里面的所有表都是innodb存储类型的话,就可以使用热备的方式,在备份的过程中它会自动进行加锁操作。
5.备份代码的三个选项
  --events:
    备份事件调度器代码
  --routines:
    备份存储过程和存储函数
  --triggers:
    备份触发器
6.备份时滚动日志:
  每次备份都应该进行日志滚动,这样恢复的时候我们只需要用一个指定的二进制日志文件(即滚动日志)进行恢复操作。
  --flush-logs:
    备份前、请求到锁之后滚动日志
7.复制时的同步位置标记
  --master-data={0|1|2}
  "0"表示不记录,
  “1”表示记录为change master语句,
  “2”表示记录为注释的change master语句,
8. 使用mysqldump备份正确姿势
  a>.请求锁:--lock-all-tables 或使用--single-transaction进行innodb热备
  b>.滚动日志:--flush-logs
  c>.选定要备份的库 --databases
  d>.记录二进制文件及位置 --master-date
 flush tables with read lock;'                #将所有表中位于缓冲区的数据同步到磁盘以后并请求施加全局的读锁,千万不要退出当前中断,一旦退出这个锁会自动释放这个锁哟!
[root@yinzhengjie mysql]# mysql -pyinzhengjie -e 'show master status;' #需要另起一个终端,日志滚动前需要看一下当前的记录日志文件ID
[root@yinzhengjie ~]# mysql -pyinzhengjie -e 'show master status;' #滚动日志
[root@yinzhengjie mysql]# mysql -pyinzhengjie -e 'show master status;' #查看是否日志滚动成功
[root@yinzhengjie ~]# mysqldump -uroot -h127.0.0. -p --databases mysql yinzhengjie > /yinzhengjie/mysql/backup/custom.sql #只备份mysql和yinzhengjie这两个数据库
[root@yinzhengjie mysql]# mysql -pyinzhengjie -e 'unlock tables;' #备份完毕之后记得要释放锁哟。

手动请求全局锁案例展示

 手动方式需要敲击很多命令,mysqldump命令给我们提供了很多参数让我们可以用一行就搞定上面的手动操作。
[root@yinzhengjie mysql]# mysqldump -uroot -h127.0.0. -p --databases mysql yinzhengjie --lock-all-tables --flush-logs --master-data= > /yinzhengjie/mysql/backup/custom2.sql #温备方式
[root@yinzhengjie mysql]# mysqldump -uroot -h127.0.0. -p --databases mysql yinzhengjie --single-transaction --flush-logs --master-data= > /yinzhengjie/mysql/backup/custom2.sql #热备方式,注意,这里需要存储表的存储引擎都是innodb哟!

自动请求全局锁案例展示

9>.恢复操作
  建议:关闭二进制日志,关闭其他用户的写操作,应该用souce命令进行恢复操作。
 mysql> set session sql_log_bin=; #开启二进制日志功能
Query OK, rows affected (0.00 sec) mysql>
mysql> set session sql_log_bin=; #关闭二进制日志功能
Query OK, rows affected (0.00 sec) mysql>
10>.基于mysqldump的备份策略
  思路:
    mysqldump+二进制日志文件
  
  周日做一次完全备份,备份的同时滚动日志,周一至周六:备份二进制日志,当我们做恢复操作时,使用我们的完全备份和二进制日志(完全备份+各二进制文件至此刻的事件 )走一遍即可。我们可以把二进制当做增量备份。也可以每天使用日志滚动操作([root@yinzhengjie mysql]# mysqladmin -pyinzhengjie flush-logs)。
11>.备份配置文件
  对于MYsql配置文件,以及与mysql相关的OS配置文件在每次修改后都应该直接进行备份。
 

MySQL的备份和恢复-mysqldump的更多相关文章

  1. MySQL的备份和恢复

    MySQL的备份和恢复 备份数据:mysqldump –uroot –p123456 dbname table [option] > dbname.sql mysqldump常用参数option ...

  2. day 50 MySQL数据备份与还原(mysqldump)

      MySQL数据备份与还原(mysqldump)   一 mysqldump指令实现数据备份.mysql指令实现数据还原 经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Databas ...

  3. mysql 完整备份和恢复

    mysql 完整备份和恢复   一.MySQL完整备份操作 1.直接打包数据库文件夹 创建数据库auth: MariaDB [(none)]> create database auth;Quer ...

  4. mysql 数据库备份,恢复。。。。

    mysql 数据备份,恢复,恢复没写,这里只写了备份... 先暂作记录吧! 备份:表结构和数据完全分开,默认有一个文件会记录所有表的结构,然后表中数据的备份 如果超过分卷的大小则会分成多个文件,不然则 ...

  5. MySQL的备份和恢复-基于LVM快照的备份(lvm-snapshot)

    MySQL的备份和恢复-基于LVM快照的备份(lvm-snapshot) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是快照卷 如上图所示,原卷和快照卷可以不一样大,因为 ...

  6. mysql数据库备份及恢复命令mysqldump,source的用法

    还原一个数据库:mysql -h localhost -u root -p123456 www<c:/www.sql 备份一个数据库:mysqldump -h localhost -u root ...

  7. JSP 实现 之 调用java方法实现MySQL数据库备份和恢复

    package cn.qm.db; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.IOEx ...

  8. mysql数据备份及恢复

    备份工具 mysqldump mysqldump是mysql和mariadb上最好的备份工具之一,免费开源. mysqldump 首先查询每个数据库和每个表的结构与数据,然后把查出的所有内容导出到文本 ...

  9. mysql 数据库备份和恢复

    物理备份对比逻辑备份 物理备份是指直接复制包含数据的文件夹和文件.这种类型的备份适用于大数据量且非常重要,遇到问题需要快速回复的数据库. 逻辑备份保存能够代表数据库信息的逻辑结构(CREATE DAT ...

随机推荐

  1. Spark内存管理

    本文基于Spark 1.6.0之后的版本 Spark 1.6.0引入了对堆外内存的管理并对内存管理模型进行了改进,SPARK-11389. 从物理上,分为堆内内存和堆外内存:从逻辑上分为executi ...

  2. C语言与数据库操作入门(Win版)

    C语言与数据库操作入门(Win版) 2017年12月10日 17:30:17 阅读数:1387 数据库,DataBase,学C语言的是不是想说,很想爱她却并不容易呢?不用着急,C语言也可以操作数据库的 ...

  3. JQuery快速入门-Ajax

    一.AJAX概述 概念:AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). 优点:通过在后台与服务器进行少量数据交换,AJAX ...

  4. 虚拟机console最小化安装操作系统图文

    1. 概述2. 安装操作系统2.1 交互界面2.2 内核镜像解压等初始化2.3 磁盘发现2.4 硬件支持告警3. 开始安装3.1 语言选择3.2 键盘选择3.3 服务器类型3.4 配置主机名3.5 时 ...

  5. Jmeter(二十三)_插件扩展

    Jmeter插件管理器 安装插件的方法有两种,一种是传统的方式,即官网下载,本地配置,重启jmeter.现在有一种快捷的方法可以自定义安装插件-插件管理器 JMeter 插件管理器的使用方法很简单:不 ...

  6. HTML 样式 (style) 实例

    77.HTML 样式 (style) 实例HTML 的 style 属性style 属性的作用: 提供了一种改变所有 HTML 元素的样式的通用方法. 样式是 HTML 4 引入的,它是一种新的首选的 ...

  7. FFMPEG的基础使用

    由于最近要将yuv视频下采样,于是使用ffmpeg快速将yuv视频下降分辨率.在此记录ffmpeg的基础使用方法和所遇到的问题: 下载,可到官网下载:https://www.ffmpeg.org/ . ...

  8. Hyperledger Fabric网络节点架构

    Fabric区块链网络的组成  区块链网络结构图 区块链网络组成 组成区块链网络相关的节点 节点是区块链的通信主体,和区块链网络相关的节点有多种类型:客户端(应用).Peer节点.排序服务(Orde ...

  9. 认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg

    一.Iconfont 1. 概述 在前端作业中,二十年前只有页面中铺满文字就算上线产品,现如今,不加点俏皮的“图标”会让页面显得很 Low 很 Low.   图标 在写这篇文章之前,我一直以为上图中的 ...

  10. PAT甲题题解-1105. Spiral Matrix (25)-(模拟顺时针矩阵)

    题意:给定N,以及N个数.找出满足m*n=N且m>=n且m-n最小的m.n值,建立大小为m*n矩阵,将N个数从大到下顺时针填入矩阵中. #include <iostream> #in ...