MySQL 备份和恢复(一)mysqldump

备份方式:
   热备:不中断服务
   温备:备份过程中不可写,要加读锁
   冷备:需要停掉服务

备份策略一:mysqldump + binlog 完全备份 + 增量,用mysqldump定期全备,每天(根据实际情况来)备份二进制日志.

mysqldump类似于一个mysql的客户端,所以用mysqldump备份时,mysql服务要启动起来,常用参数:

-u username | --user=username 指定备份的用户

-p password | --password=password

-h host | --host=host

-p port | --port=port

-A --all-databases 备份所有数据库

-B --databases db_name 选择要备份的数据库

-C --compress 启用压缩

-d --no-data 备份空库,不备份数据

-E --events 同时备份事件调度器代码

-F --flush-logs 备份前先滚动日志

--ignore-tables db_name.tb_name 指定哪些表不必备份

--lock-tables 要备份一张表时,备份前先锁定表

-x --lock-all-tables 备份前锁定所有库的所有表

--single-transaction 为备份创建一个大事务,基于快照原理实现MVCC对InnoDB热备,开启此选项则不用-x,只对InnoDB支持事务的表才可保证一致性

--master-data = 0|1|2 在复制架构中,指定如何处理配置主从服务器的语句如CHANGE MASTER TO statement,值为2记录但是是注释掉,应用时不生效,值为1记录不注释,应用时生效, 0为不启用。

过程简单演示:

[[email protected] ~]# mysqldump -uroot -pmypass --all-databases --master-data=2 --lock-all-tables --flush-logs > /backup/full_db_`date +%F`.sql
[[email protected] ~]# ls /backup/full_db_2014-07-29.sql -l
-rw-r--r--. 1 root root 523830 Jul 29 11:08 /backup/full_db_2014-07-29.sql
MariaDB [hellodb]> SELECT * FROM scores;
+----+-------+----------+-------+
| ID | StuID | CourseID | Score |
+----+-------+----------+-------+
|  1 |     1 |        2 |    77 |
|  2 |     1 |        6 |    93 |
|  3 |     2 |        2 |    47 |
|  4 |     2 |        5 |    97 |
|  5 |     3 |        2 |    88 |
|  6 |     3 |        6 |    75 |
|  7 |     4 |        5 |    71 |
|  8 |     4 |        2 |    89 |
|  9 |     5 |        1 |    39 |
| 10 |     5 |        7 |    63 |
| 11 |     6 |        1 |    96 |
| 12 |     7 |        1 |    86 |
| 13 |     7 |        7 |    83 |
| 14 |     8 |        4 |    57 |
| 15 |     8 |        3 |    93 |
+----+-------+----------+-------+
15 rows in set (0.00 sec)

MariaDB [hellodb]> DELETE FROM scores WHERE ID>10 AND ID<=14;
Query OK, 4 rows affected (0.08 sec)

MariaDB [hellodb]> SELECT * FROM hellodb.scores;
+----+-------+----------+-------+
| ID | StuID | CourseID | Score |
+----+-------+----------+-------+
|  1 |     1 |        2 |    77 |
|  2 |     1 |        6 |    93 |
|  3 |     2 |        2 |    47 |
|  4 |     2 |        5 |    97 |
|  5 |     3 |        2 |    88 |
|  6 |     3 |        6 |    75 |
|  7 |     4 |        5 |    71 |
|  8 |     4 |        2 |    89 |
|  9 |     5 |        1 |    39 |
| 10 |     5 |        7 |    63 |
| 15 |     8 |        3 |    93 |
+----+-------+----------+-------+
11 rows in set (0.00 sec)

/* 这里把二进制日志关掉插入些数据,下面会把二进制再打开,再插入些数据 */
MariaDB [hellodb]> SET sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> SHOW VARIABLES LIKE ‘%SQL_LOG_BIN%‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

MariaDB [hellodb]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 |      495 |              |                  |
+------------------+----------+--------------+------------------+

MariaDB [hellodb]> INSERT INTO scores (StuID,CourseID,Score) VALUES (3,3,3),(4,4,4),(5,5,5);
Query OK, 3 rows affected (0.06 sec)
Records: 3  Duplicates: 0  Warnings: 0

/* 这里顺带看下二进制日志位置在495 */
MariaDB [hellodb]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 |      495 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

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

MariaDB [hellodb]> SHOW VARIABLES LIKE ‘sql_log_bin‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_log_bin   | ON    |
+---------------+-------+
1 row in set (0.00 sec)

/* 把binlog打开后再插入一些数据 */
MariaDB [hellodb]> INSERT INTO scores (StuID,CourseID,Score) VALUES (10,11,12),(13,14,15);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

/* LAST_INSERT_ID()这个函数可以查看有AUTO_INCREMENT属性的字段上次长到哪里了 */
MariaDB [hellodb]> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|               19 |
+------------------+
1 row in set (0.00 sec)

/* 仔细看一下下面的查询结果我们新插入的数据并没有按顺序在ID=15后面,而是依次被存入到之前删除的行释放后的存储空间里了 */
MariaDB [hellodb]> SELECT * FROM scores;
+----+-------+----------+-------+
| ID | StuID | CourseID | Score |
+----+-------+----------+-------+
|  1 |     1 |        2 |    77 |
|  2 |     1 |        6 |    93 |
|  3 |     2 |        2 |    47 |
|  4 |     2 |        5 |    97 |
|  5 |     3 |        2 |    88 |
|  6 |     3 |        6 |    75 |
|  7 |     4 |        5 |    71 |
|  8 |     4 |        2 |    89 |
|  9 |     5 |        1 |    39 |
| 10 |     5 |        7 |    63 |
| 19 |    10 |       11 |    12 |
| 18 |     5 |        5 |     5 |
| 17 |     4 |        4 |     4 |
| 16 |     3 |        3 |     3 |
| 15 |     8 |        3 |    93 |
| 20 |    13 |       14 |    15 |
+----+-------+----------+-------+
16 rows in set (0.00 sec)

/* 删除hellodb数据库,模拟数据库崩溃 */
MariaDB [(none)]> DROP DATABASE hellodb;
Query OK, 9 rows affected (0.47 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)

/* 因为全备时用了--flush-logs选项,所以只要备份最后一个二进制日志就可以了 */
cp /mydata/data/mysql-bin.000006 /backup/
[[email protected] data]# cd /backup/

/* 因为执行了DROP DATABASE语句,所以恢复时把这个语句之前的binlog应用就可以了 */
[[email protected] backup]# mysqlbinlog ‘mysql-bin.000006‘ | grep ‘DROP DATABASE‘ -B 15
#140729 13:59:59 server id 1  end_log_pos 594 	Intvar
SET INSERT_ID=19/*!*/;
# at 594
#140729 13:59:59 server id 1  end_log_pos 730 	Query	thread_id=25	exec_time=0	error_code=0
SET TIMESTAMP=1406613599/*!*/;
INSERT INTO scores (StuID,CourseID,Score) VALUES (10,11,12),(13,14,15)
/*!*/;
# at 730
#140729 13:59:59 server id 1  end_log_pos 802 	Query	thread_id=25	exec_time=0	error_code=0
SET TIMESTAMP=1406613599/*!*/;
COMMIT
/*!*/;
# at 802
#140729 14:15:57 server id 1  end_log_pos 889 	Query	thread_id=26	exec_time=0	error_code=0
SET TIMESTAMP=1406614557/*!*/;
DROP DATABASE hellodb

/* 找到位置后把需要的日志导出来 */
[[email protected] backup]# mysqlbinlog ‘mysql-bin.0000061‘ --stop-position=730 > /backup/inr-001.sql

/* 恢复完全备份,这里直接是全库备份了,当然也可以根据需要对单库单表备份 */
[[email protected] backup]# mysql < /backup/full_db_2014-07-29.sql
/* 恢复后可以看到hellodb已经恢复回来,数据内容也都在了 */
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mydb               |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> USE hellodb;
Database changed
MariaDB [hellodb]> SELECT * FROM scores;
+----+-------+----------+-------+
| ID | StuID | CourseID | Score |
+----+-------+----------+-------+
|  1 |     1 |        2 |    77 |
|  2 |     1 |        6 |    93 |
|  3 |     2 |        2 |    47 |
|  4 |     2 |        5 |    97 |
|  5 |     3 |        2 |    88 |
|  6 |     3 |        6 |    75 |
|  7 |     4 |        5 |    71 |
|  8 |     4 |        2 |    89 |
|  9 |     5 |        1 |    39 |
| 10 |     5 |        7 |    63 |
| 11 |     6 |        1 |    96 |
| 12 |     7 |        1 |    86 |
| 13 |     7 |        7 |    83 |
| 14 |     8 |        4 |    57 |
| 15 |     8 |        3 |    93 |
+----+-------+----------+-------+
15 rows in set (0.00 sec)

/* 上面删除数据的时候忘备份一份二进制日志了,图省事,手动造一下 */
[[email protected] backup]# mysqlbinlog ‘mysql-bin.000006‘ | grep --color ‘DELETE FROM‘ -C 5
/*!*/;
# at 316
#140729 11:17:42 server id 1  end_log_pos 423 	Query	thread_id=25	exec_time=0	error_code=0
use `hellodb`/*!*/;
SET TIMESTAMP=1406603862/*!*/;
DELETE FROM scores WHERE ID>10 AND ID<=14
/*!*/;
# at 423
#140729 11:17:42 server id 1  end_log_pos 495 	Query	thread_id=25	exec_time=0	error_code=0
SET TIMESTAMP=1406603862/*!*/;
COMMIT

[[email protected] backup]# mysqlbinlog ‘mysql-bin.000006‘ --stop-position=423 > /backup/inc-001.sql
[[email protected] backup]# mysqlbinlog ‘mysql-bin.000006‘ --start-position=423 --stop-position=730 > /backup/inc-002.sql
[[email protected] backup]# mysql < inc-001.sql 
/* 恢复到时间点一,ID 11到14被删除 */
MariaDB [(none)]> SELECT * FROM hellodb.scores;
+----+-------+----------+-------+
| ID | StuID | CourseID | Score |
+----+-------+----------+-------+
|  1 |     1 |        2 |    77 |
|  2 |     1 |        6 |    93 |
|  3 |     2 |        2 |    47 |
|  4 |     2 |        5 |    97 |
|  5 |     3 |        2 |    88 |
|  6 |     3 |        6 |    75 |
|  7 |     4 |        5 |    71 |
|  8 |     4 |        2 |    89 |
|  9 |     5 |        1 |    39 |
| 10 |     5 |        7 |    63 |
| 15 |     8 |        3 |    93 |
+----+-------+----------+-------+
11 rows in set (0.00 sec)

/* 恢复到时间点二,插入了一些数据后,哎我去,咋的我插入了那老些数据就剩这一点了捏,这正是sql-bin-log变量起作用了,因为当时有几条数据是关闭了二进制日志做的操作,所以未被记录到binlog,自然恢复过来的数据中也就木有了,这点在做恢复时是非常有必要的,因为恢复时的操作都是之前做过的,关闭二进制日志可以避免不必要的开销。*/
[[email protected] backup]# mysql < inc-002.sql 
MariaDB [(none)]> SELECT * FROM hellodb.scores;
+----+-------+----------+-------+
| ID | StuID | CourseID | Score |
+----+-------+----------+-------+
|  1 |     1 |        2 |    77 |
|  2 |     1 |        6 |    93 |
|  3 |     2 |        2 |    47 |
|  4 |     2 |        5 |    97 |
|  5 |     3 |        2 |    88 |
|  6 |     3 |        6 |    75 |
|  7 |     4 |        5 |    71 |
|  8 |     4 |        2 |    89 |
|  9 |     5 |        1 |    39 |
| 10 |     5 |        7 |    63 |
| 20 |    13 |       14 |    15 |
| 19 |    10 |       11 |    12 |
| 15 |     8 |        3 |    93 |
+----+-------+----------+-------+
13 rows in set (0.00 sec)

MySQL 备份和恢复(一)mysqldump

时间: 2024-10-11 14:26:22

MySQL 备份和恢复(一)mysqldump的相关文章

Mysql备份和恢复

Mysql备份和恢复 备份 热备,是指对数据库运行中直接进行备份,对正在运行的数据库没有任何影响: 冷备,是指在数据库停止(关闭)下进行备份,只需拷贝相关的数据物理文件: 温备,是指对数据库运行中直接进行备份,但对当前数据库操作有所影响,很少用. 按备份出来的文件内容分为: 逻辑备份: 裸文件备份. 逻辑备份后文件内容是可读的,通常是文本文件,内容一般是Sql语句或表内的实际数据,如mysqldump或select * into outfile等方法.适用于数据库的升级.迁移,恢复时间较长. 裸

mysql 备份及恢复

数据库备份 增量备份.差异备份区别 增量是每天相对于前一天的备份 差异是相对于完全备份的时间点 1.冷备份 离线,读写操作终止 2.热备份 备份是读写不受影响 3.温备份 仅可以读操作 4.物理备份:备份数据文件.逻辑备份:将数据导出至文本中 5.备份内容:数据库配置文件.数据.二进制日志.事务日志 6.热备份:innoDB:xtrabackup,mysqldump MyISAM:温度备份 mysql=====主从架构,离线备份 物理备份:速度快 逻辑备份:速度慢,丢失浮点数精度 7.备份策略

MySQL 备份和恢复(二)基于LVM实现几乎热备

LVM(Logical Volume Management逻辑卷管理)实现几乎热备的原理:利用LVM的快照卷达到可以保存数据库在某一时刻的瞬时状态,只需把当时的快照备份出来即可. LVM的快照原理:简单的讲就是lvm对某个卷创建快照卷后,快照卷则作为原卷的另一个访问入口,当原卷的数据发生变化时,则先把原卷的内容先复制一份到快照卷,然后才会继续对原卷数据的修改,这也就是之所以快照卷的容量大小应该大于整个备份过程中数据库的变化量的原因.所以当备份完成以后,快照卷也就可以拆除了,它的作用就是在备份过程

MySQL系列——MySQL备份和恢复

MYSQL的备份和还原备份 :副本RAID1,RAID10 :保证硬件损坏而不会业务中止:备份和还原 :可以保证因逻辑错误引起的数据丢失备份类型 :热备份 :读写不受影响温备份 :仅可以执行读操作冷备份 :离线备份,读.写操作均中止 物理备份和逻辑备份物理备份 :复制数据文件逻辑备份 :将数据导出至文本文件中 完全备份.增量备份和差异备份备份什么:数据.配置文件.二进制日志.事务日志主从服务器架构 物理备份 :速度快逻辑备份 :速度慢.丢失浮点数精度:方便使用文本处理工具直接对其处理,可移植能力

MySQL 备份和恢复(三)Xtrabackup实现热备:完全备份+增量备份

Percona XtraBackup is the world's only open-source, free MySQL hot backup software that performs non-blocking backups for InnoDB and XtraDB databases. With Percona XtraBackup, you can achieve the following benefits: Backups that complete quickly and

MySQL备份,恢复方案,mysqlbinlog,mysqldump,主从,主主复制

DBMS数据库管理系统的三层模型:物理层,逻辑层以及视图层. 物理层:决定数据的存储形式. 逻辑层:是一张有一张的表,一行行的数据记录. 视图层:让用户看起来更方便,可有可无. 存储引擎:使逻辑层中sql语句转换成能在磁盘上存储的物理形式,连接逻辑层与物理层. 常用MySQL存储引擎: MyISAM: 最经典的MySQL存储引擎,但如果数据库一旦崩溃,再重启时需要对表进行修复,但MyISAM 存储引擎无法保证安全修复,且其不支持事务的进行.支持表级锁. Innodb: Innodb存储引擎,支持

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

还原一个数据库:mysql -h localhost -u root -p123456 www<c:/www.sql 备份一个数据库:mysqldump -h localhost -u root -p123456 www > d:/www2008-2-26.sql //以下是在程序中进行测试 //$command = "mysqldump --opt -h $dbhost -u $dbuser -p $dbpass $dbname | gzip > $backupFile&qu

MySQL备份方案--&gt;(利用mysqldump以及binlog二进制日志)

From:http://blog.csdn.net/mchdba/article/details/11575605 随着数据不断增加,而且为了兼容以后的innodb存储引擎, 所以考虑采用mysqldump全备+日志增量备份的策略.使用mysqldump对于MySQL大部分mysql存储引擎比如myisam.innodb都有很好的支持. 方案一:mysqldump全备份+日志增量备份 1, mysqldump备份方案: 周一凌晨3点全备 周二到周日凌晨3点增量备份 2, 备份步骤 (1)    

mysql备份与还原之mysqldump

一.备份类型逻辑备份:把数据导出到一个文档中(.sql/.txt)适合场景:中小型数据库 物理备份:保存/usr/local/mysql/data数据库文件目录适合场景:大型数据库 在线热备(冗余):需要有多台机器,主备模式,集群模式 二.逻辑备份(mysqldump)表级别备份mysqldump [OPTIONS] database [tables]库级别备份mysqldump [OPTIONS] --databases DB1 [DB2 DB3...]全库级别备份mysqldump [OPT