MySQL的备份和恢复-mysqldump
MySQL的备份和恢复-mysqldump
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
天有不测风云嘛,如果你的服务器被黑客攻击了(比如现在比较流行的比特币病毒),或是你的新同事手一哆嗦不小心删除了一个生产上的数据库,你们boss找你们技术总监解决问题,你发现你的新同事时跑路了,这个时候你就得感激你的备份啦!
比如一个开发想要知道某一个数据在过去的某一时刻是什么样子的,这个时候你的备份就又一次可以大显身手啦!
比如MySQL想从5.1升级到5.5版本。当你升级的时候失败时,你可以进行恢复操作等等。
备份的目的是用于恢复,对备份数据做恢复测试是很有必要的。这样你参会知道你的备份内容是否有效,如果发现备份的内容无效的话,赶紧重新备份,不然如果生成环境哪天真出了事情,将会带来不可挽回的地步哟!尤其是电商平台,备份的相当有必要的!如果哪天数据库奔溃了你无法恢复这不仅仅意味着你的饭碗会丢,还会导致公司造成巨额损失。
冷备(cold backup)
需要服务器离线,这就意味着数据的读写操作都不能进行啦,对运维来讲,这是最安全的备份方式但也是最不靠谱的备份方式哟!不能因为备份就让服务下线,这样会映像客户体验的,你想想,淘宝网如果说采用这种方式,那全天下的妹纸们不都得找马云撒娇去啦!
温备(warm backup)
全局施加共享锁,只能读,不能写。这种方式服务器不需要离线,只是限制了写操作。
热备(hot backup)
服务器不需要离线,用户也可以进行读写操作。这种备份方式不会影响正常的业务,且保证数据的备份的时间点都是一致的。这种备份方式需要基于事物的支持哟!
完全备份(full backup)
它会备份整个数据库。
部分备份 (partial backup)
它可能只会备份某个库的部分数据,比如某张表或是一张表中的部分数据。
物理备份(Physical backup)
直接复制(归档)数据文件的备份方式.说白了这种方式就是一个复制操作,我们只要使用tar命令和cp命令来协助我们完成本分即可。因此它不需要其他工具来帮助我们来备份。恢复起来也很简单,直接将数据解压到数据目录中去即可,但是可能存在版本兼容的问题(和存储引擎有关)哟,因此这种跨平台方式就相对逻辑备份要查很多呢。如果数据量大的话,这个时候逻辑备份的效率就会显得很低,因此建议使用物理备份。
逻辑备份(Logical backup)
把数据从库中提取出来保存为文本文件.我们可以使用mysqldump来进行备份。
逻辑备份的优点:可以基于网络恢复,且我们可以用cat,grep等命令来查看文件的内容。这种方式备份跟存储引擎无关,我们可以通过sed命令对这个文本文件进行修改默认的存储引擎等等,有助于备份数据损坏。
逻辑备份的缺点:它恢复速度回比物理备份要满,且占用空间相对较大。最致命的一点就是无法完整保存浮点数的精度,更重要的是基于这种恢复方式需要你自己重建索引,如果恢复的数据较多时,重建索引又是一个令人头疼的问题
完全备份(full backup)
顾名思义,将整个数据库都备份出来。建议每周做一次完全备份。
增量备份(incremental backup)
我们使用这种方式较多一点,和上一次备份对比,只备份修改过的内容。建议每天做一次增量备份。优点就是占用空间小。
差异备份(differential backup)
从上一个完全备份开始备份,当我们想要恢复数据时,只需要最近一天的备份即可,很明显,差异备份占据的空间肯定是要比增量备份要大的。
备份策略我们可以通过以下几个角度去思考:
1>.选择备份方式(推荐物理备份)
2>.选择备份时间(推荐凌晨2~3点)
3>.考虑到恢复成本(需要考虑恢复时长)
4>.考虑备份成本( 锁时间, 备份时长,备份负载)
1>.数据;
2>.MySQL的配置文件;
3>.代码(存储过程、存储函数、触发器);
4>.OS相关的配置文件,如crontab配置计划及相关脚本;
5>.跟复制相关的配置信息(二进制日志文件,尤其是主从同步的场景);
它是一个逻辑备份工具,可以对不同的存储引擎实现不同的备份机制,如,支持:InnoDB热备、MyISAM温备、Aria温备。备份和恢复过程较慢,因为它是单线程的备份工具。数据大于10G以上不建议使用这个备份工具,因为效率太低啦!
它也是一个逻辑备份工具,相比mysqldump而言,它用时更短,你可以理解它是多线程的mysqldump。但是很难实现差异或增量备份
接近于热备的工具,因为要先请求全局锁,而后创建快照,并在创建完成后释放全局锁,使用cp、tar等工具进行物理备份。它的特点是备份和恢复速度较快,但是缺点就是很难实现增量备份,并且请求全局锁需要等待一段时间,在繁忙的服务器上尤其如此。
SELECT clause INTO OUTFILE ‘/path/to/somefile’
#将数据备份到本地文件
LOAD DATA INFILE ‘/path/from/somefile’
#将数据从本地文件中恢复回来
它是个逻辑备份工具,快于mysqldump,部分备份工具,不会备份关系定义,仅备份表中的数据.无法实现增量备份。
它是商业备份工具,innobackup。
由Percona提供的开源备份工具。支持InnoDB热备且支持增量备份,MyISM温备且不支持增量备份。它属于物理备份类型,备份和恢复的速度很快。
这是MySQL自带的工具,很遗憾的是它几乎冷备工具。因此它用的很少。
mysqldump其实就是MySQL客户端的一个工具,也就是说,你的MySQL服务器和你的mysqldump可以在不同的主机上,从而实现远程备份的方式。适合备份较小的数据,如果数据内容在5~10G之间的话,采用mysqldump的本分方式是再好不过的啦。
[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>
[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 ~]#
需要用到的参数:--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 ~]#
请求锁定所有表之后在备份,对MyISAM,InnoDB,Aria做温备
以上的3中备份方式在生产环境中并不适用,我们知道生产上的数据库可能随时都在和用户进行交互,如果我们用以上的方式备份肯定会存在问题。因为我们在备份的同时如果有人往里面写入数据了,可能拿到的结果和生产上的结果是不一致的,因此,我们在备份的时候可以添加写锁。即“[root@yinzhengjie ~]# mysqldump -pyinzhengjie --databases yinzhengjie --lock-all-tables > /yinzhengjie/mysql/backup/yzj.sql”,但是这种备份方式并不理想,因为在备份期间会导致所有的数据请求都会被阻塞住。
对InnoDB存储引擎实现热备
只要你能确认你的库里面的所有表都是innodb存储类型的话,就可以使用热备的方式,在备份的过程中它会自动进行加锁操作。
--events:
备份事件调度器代码
--routines:
备份存储过程和存储函数
--triggers:
备份触发器
每次备份都应该进行日志滚动,这样恢复的时候我们只需要用一个指定的二进制日志文件(即滚动日志)进行恢复操作。
--flush-logs:
备份前、请求到锁之后滚动日志
--master-data={0|1|2}
"0"表示不记录,
“1”表示记录为change master语句,
“2”表示记录为注释的change master语句,
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哟!
自动请求全局锁案例展示
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>
思路:
mysqldump+二进制日志文件
周日做一次完全备份,备份的同时滚动日志,周一至周六:备份二进制日志,当我们做恢复操作时,使用我们的完全备份和二进制日志(完全备份+各二进制文件至此刻的事件 )走一遍即可。我们可以把二进制当做增量备份。也可以每天使用日志滚动操作([root@yinzhengjie mysql]# mysqladmin -pyinzhengjie flush-logs)。
对于MYsql配置文件,以及与mysql相关的OS配置文件在每次修改后都应该直接进行备份。
MySQL的备份和恢复-mysqldump的更多相关文章
- MySQL的备份和恢复
MySQL的备份和恢复 备份数据:mysqldump –uroot –p123456 dbname table [option] > dbname.sql mysqldump常用参数option ...
- day 50 MySQL数据备份与还原(mysqldump)
MySQL数据备份与还原(mysqldump) 一 mysqldump指令实现数据备份.mysql指令实现数据还原 经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Databas ...
- mysql 完整备份和恢复
mysql 完整备份和恢复 一.MySQL完整备份操作 1.直接打包数据库文件夹 创建数据库auth: MariaDB [(none)]> create database auth;Quer ...
- mysql 数据库备份,恢复。。。。
mysql 数据备份,恢复,恢复没写,这里只写了备份... 先暂作记录吧! 备份:表结构和数据完全分开,默认有一个文件会记录所有表的结构,然后表中数据的备份 如果超过分卷的大小则会分成多个文件,不然则 ...
- MySQL的备份和恢复-基于LVM快照的备份(lvm-snapshot)
MySQL的备份和恢复-基于LVM快照的备份(lvm-snapshot) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是快照卷 如上图所示,原卷和快照卷可以不一样大,因为 ...
- mysql数据库备份及恢复命令mysqldump,source的用法
还原一个数据库:mysql -h localhost -u root -p123456 www<c:/www.sql 备份一个数据库:mysqldump -h localhost -u root ...
- JSP 实现 之 调用java方法实现MySQL数据库备份和恢复
package cn.qm.db; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.IOEx ...
- mysql数据备份及恢复
备份工具 mysqldump mysqldump是mysql和mariadb上最好的备份工具之一,免费开源. mysqldump 首先查询每个数据库和每个表的结构与数据,然后把查出的所有内容导出到文本 ...
- mysql 数据库备份和恢复
物理备份对比逻辑备份 物理备份是指直接复制包含数据的文件夹和文件.这种类型的备份适用于大数据量且非常重要,遇到问题需要快速回复的数据库. 逻辑备份保存能够代表数据库信息的逻辑结构(CREATE DAT ...
随机推荐
- 软件工程第二次作业(JUnit的使用)
初次使用JUnit 感谢学习资源Junit使用的超简单介绍源 一.开发环境及界面截图: 系统 Windows 10 编辑器 eclipse 语言 ...
- EntityFramework Core 2.x (ef core) 在迁移中自动生成数据库表和列说明
在项目开发中有没有用过拼音首字母做列名或者接手这样的项目? 看见xmspsqb(项目审批申请表)这种表名时是否有一种无法抑制的想肛了取名的老兄的冲动? 更坑爹的是这种数据库没有文档(或者文档老旧不堪早 ...
- LintCode——Pour Water
Pour Water: We are given an elevation map, heights[i] representing the height of the terrain at that ...
- symfon2 配置文件使用 + HttpRequest使用 + Global多语言解决方案
1. 在 app/conig中建立一个自命名的文件: abc.yml 2. 在 app/config/config.yml中导入abc.yml 文件头部: imports:- { resource: ...
- SQL执行结果操作
1. 返回执行结果中的一行 mysql_fetch_row() 返回执行结果的当前行的数值数组,执行这个函数后,结果指向下一行. e.g. $row = mysql_fetch_row($result ...
- PAT甲题题解-1050. String Subtraction (20)-水题
#include <iostream> #include <cstdio> #include <string.h> #include <algorithm&g ...
- 作业五:分析system_call中断处理过程
分析system_call中断处理过程 一.MesuSO增加getpid和getpid-asm 二.使用GDB跟踪系统调用内核函数sys_getpid 分析system_call中断处理过程 使用gd ...
- 使用SSH过程中遇到的几个问题及解决方案
一.HTTP Status 500 - org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: B ...
- Android的发展历程及搭建
Android的发展历程: 对于Android我比较不熟悉,因为我的第一只手机就是iphone,我没用过Android系统,但在中国使用带有Android系统的手机的人数是最多的,所以我想学习Andr ...
- Yale数据库上的人脸识别
一.问题分析 1. 问题描述 在Yale数据集上完成以下工作:在给定的人脸库中,通过算法完成人脸识别,算法需要做到能判断出测试的人脸是否属于给定的数据集.如果属于,需要判断出测试的人脸属于数据集中的哪 ...