备份工具 mysqldump

mysqldump是mysql和mariadb上最好的备份工具之一,免费开源。

mysqldump 首先查询每个数据库和每个表的结构与数据,然后把查出的所有内容导出到文本文件中。它创建的默认的文本文件被称为dump文件,里面包含重建数据库和数据必需的SQL语句。

备份所有数据库

mysqldump --user=admin_backup \
--password=123 --lock-all-tables
--all-databases > /root/all-dbs.sql

--user=admin_back

让mysqldump以admin_back用户与MYSQL服务器交互,应该尽量不用root帐号来备份,因为如果是爱脚本执行的时候需要指定用户名和密码,而且都是明文写在脚本中,这样容易暴露,因此创建一个专有帐户只需要读表和锁表权限更安全。

--password=123

指明备份帐号的密码,交互模式下可以使用--password 后面在弹出需要输入密码的时候再输入密码。

--lock-all-tables

在做备份前,先让mysql锁住所有表,备份完成才解锁,这会有个问题,对于比较繁忙的数据库来说,长时间锁表会有很大影响。应尽量分表分库备份。

--all-databases

导出所有数据库。

备份指定的数据库

mysqldump --user=admin_back --password --lock-tables \
--verbose --databases test > /root/test.sql

--verbose

显示备份详细过程

--databases

后面接数据库的名称,指定备份哪个数据库,如果要备份多个数据库,后面写上多个数据库的名称,并用空格隔开。

备份指定表

mysqldump --user=admin_back --password --lock-tables \
--verbose --databases test --tables user > /root/test-user.sql

--tables

后面接表名,指定要备份的表

创建备份脚本

如果要想自动化备份可以编写脚本列入crontab。如:

#!/bin/bash
# backup mysql use mydqldump tool,and add to crontab
my_user='admin_back'
my_pwd='123'
db1='test1'
db2='test2'
date_today=$(date +%Y-%m-%d-%H:%M:%S)
backup_dir='/data/backup'
dump_file=$db1-$db2-$date-today'.sql'
/usr/bin/mysqldump --user=$my_user --password=$my_pwd --lock-tables --databases $db1 $db2 > $backup_dir$dump_file

加入crontab任务计划

crontab -e -u root
* 1 * * * /root/back_mysql.sh

恢复数据库

mysql --user=admin_backup --password < /root/test.sql

用二进制日志来恢复

使用二进制日志可以做到按时间节点来恢复数据。二进制日志会记录所有执行过的,修改数据的SQL语句。

  • 开启二进制日志

    在my.cnf文件[mysqld]部分加入以下语句
[mysqld]
log-bin
binlog-ignore-db=mysql
重启mysql服务器,查看状态
MariaDB [(none)]> show master status;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| mysql-bin-200.000002 | 2447 | m_s | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
查看二进制日志保存位置
MariaDB [(none)]> show variables where variable_name like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
# ls /var/lib/mysql/mysql-bin*
/var/lib/mysql/mysql-bin-200.000001
/var/lib/mysql/mysql-bin-200.000002
/var/lib/mysql/mysql-bin-200.000003
/var/lib/mysql/mysql-bin-200.index
  • 将二进制日志导出
# mysqlbinlog --database=m_s /var/lib/mysql/mysql-bin-200.000003 >/root/m_s.txt
# ll /root/m_s.txt
-rw-r--r--. 1 root root 920 Mar 17 13:55 /root/m_s.txt
  • 查看二进制日志内容
# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000003
# at 922
#180317 14:58:31 server id 200 end_log_pos 989 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1521269911/*!*/;
BEGIN
/*!*/;
# at 989
#180317 14:58:31 server id 200 end_log_pos 1104 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1521269911/*!*/;
insert into haha (id,name) values(3,"3aaa"),(4,"4bb")
/*!*/;
# at 1104
#180317 14:58:31 server id 200 end_log_pos 1131 Xid = 159
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

其中#开头表示注释

BEGIN和COMMIT中间表示事务

at 后面跟的是pos位置信息

at下面一行表示 执行时间,结束日志位置号

使用二进制恢复实例

  • 查看数据库及表中数据
MariaDB [m_s]> select * from haha;
+----+-----------+
| id | name |
+----+-----------+
| 1 | wangshib |
| 2 | guohuihui |
| 3 | 3aaa |
| 4 | 4bb |
+----+-----------+
4 rows in set (0.00 sec)
  • 先备份数据库
# mysqldump --database m_s --user=root --password --tables haha --flush-logs > /root/mysql/m_s-haha.sql
Enter password:
# ll /root/mysql/m_s-haha.sql
-rw-r--r--. 1 root root 1917 Mar 17 15:29 /root/mysql/m_s-haha.sql

--flush-logs 表示备份时刷新二进制日志

  • 删除表中的行

我们手动把 haha 表中的id为3和4的数据删除

MariaDB [m_s]> delete from haha where id in (3,4);
Query OK, 1 row affected (0.00 sec) MariaDB [m_s]> select * from haha;
+----+-----------+
| id | name |
+----+-----------+
| 1 | wangshib |
| 2 | guohuihui |
+----+-----------+
3 rows in set (0.00 sec)
  • 从二进制日志中抽取需要恢复的行

先导出二进制日志

先查看一下二进制日志
MariaDB [m_s]> show master logs;
+----------------------+-----------+
| Log_name | File_size |
+----------------------+-----------+
| mysql-bin-200.000001 | 2664 |
| mysql-bin-200.000002 | 2466 |
| mysql-bin-200.000003 | 1178 |
| mysql-bin-200.000004 | 428 |
+----------------------+-----------+
4 rows in set (0.00 sec)
[root@master ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000003 |grep insert
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
insert into haha (id,name) values('7','aaa')
insert into m_s.haha values(1,"wangshib"),(2,"guohuihui")
insert into haha (id,name) values(3,"3aaa"),(4,"4bb")
[root@master ~]# mysqlbinlog -v /var/lib/mysql/mysql-bin-200.000004 |grep insert
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
我们看到在mysql-bin-200.000003这个日志中记录了 插入语句(id,3,4),那就把这个二进制日志先导出成为文本文件再抽取出我们需要恢复语句。 # mysqlbinlog --database=m_s /var/lib/mysql/mysql-bin-200.000003 > /root/mysql/m_s-haha.txt
[root@master ~]# vi /root/mysql/m_s-haha.txt
...
# at 922
61 #180317 14:58:31 server id 200 end_log_pos 989 Query thread_id=2 exec_time=0 error_code=0
62 SET TIMESTAMP=1521269911/*!*/;
63 BEGIN
64 /*!*/;
65 # at 989
66 #180317 14:58:31 server id 200 end_log_pos 1104 Query thread_id=2 exec_time=0 error_code=0
67 SET TIMESTAMP=1521269911/*!*/;
68 insert into haha (id,name) values(3,"3aaa"),(4,"4bb")
69 /*!*/;
70 # at 1104
71 #180317 14:58:31 server id 200 end_log_pos 1131 Xid = 159
...

这里执行insert id=3的语句开始pos位置为 989 结束于1104

  • 恢复数据
# mysqlbinlog --database=m_s --start-position="989" --stop-position="1104" /var/lib/mysql/mysql-bin-200.000003 | mysql --user=root --password
Enter password:
MariaDB [m_s]> select * from haha;
+----+-----------+
| id | name |
+----+-----------+
| 1 | wangshib |
| 2 | guohuihui |
| 3 | 3aaa |
| 4 | 4bb |
+----+-----------+
4 rows in set (0.00 sec)

这里看到数据已经恢复成功。

mysql数据备份及恢复的更多相关文章

  1. mysql数据备份及恢复详细操作

    一.数据库数据备份 1.全备 BakDir=/backup/full #创建全备目录 LogFile=/backup/full/bak.log #创建备份日志 Date=`date +%Y%m%d` ...

  2. MySQL数据备份和恢复

    1.数据备份 mysqldump -uroot -p databasename > file.sql 2.数据还原 mysql -u root -p databasename < file ...

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

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

  4. MySQL数据库的数据备份和恢复(导入和导出)命令操作语法【转】

    不管是Oracle数据库还是SQL Server数据库,每个数据库都有自己的一套数据备份和恢复的方法,MySQL数据库也不例外.MySQL数据库备份和恢复用到了两个命令,分别是“mysqldump”和 ...

  5. MySQL的备份和恢复

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

  6. MySQL数据备份之mysqldump使用(转)

    mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...

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

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

  8. MySQL的备份和恢复-mysqldump

    MySQL的备份和恢复-mysqldump 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么需要备份 1>.做灾难恢复 天有不测风云嘛,如果你的服务器被黑客攻击了(比 ...

  9. innobackupex不停库的数据备份并恢复到别的服务器上【转】

    1.innobackupex原理: 备份原理 1).首先会开启一个后台检测进程,实时检测myql redo的变化,一旦发现redo中有新日志写入,立即将日志记入后台日志文件xtrabackup_log ...

随机推荐

  1. SharePoint Framework解决方案管理参考(一)

    博客地址:http://blog.csdn.net/FoxDave 使用SPFx,你的企业可以轻松构建解决方案跟Office 365和SharePoint Online集成.SPFx解决方案基于现代w ...

  2. Python机器学习(基础篇---监督学习(k近邻))

    K近邻 假设我们有一些携带分类标记的训练样本,分布于特征空间中,对于一个待分类的测试样本点,未知其类别,按照‘近朱者赤近墨者黑’,我们需要寻找与这个待分类的样本在特征空间中距离最近的k个已标记样本作为 ...

  3. Linux 系统运行命令 > 查看系统信息

    查看系统运行状态 一 . 查看硬件信息 - 1. cpu信息(可以通过find,whereis,locate查出路径) #cat /proc/cpuinfo 2 . 内存信息:meminfo(可以用c ...

  4. nim读写注册表的小例子

    nim读写注册表的小例子 2018年5月7日 15:11:58 codegay 贴一个nim读写注册表的例子,虽然简单,但是nim官方没有写windows注册表相关的文档, 我贴的例子兴许能帮大家省点 ...

  5. css中关于单位的一些问题

    Css中关于单位的一些问题 相对字体长度: Em:Em 是一个相对单位.起初排版度量时是基于当前字体大写字母”M”的尺寸的.当改变font-family时,它的尺寸不会发生改变,但在改变font-si ...

  6. php的array数组 -------方法foreach循环时候,利用数组里值的引用地址(& )从而改变数组里的值

    /* * 把每个数组值后面都加个SQL然后返回数组 * foreach循环时候,直接用引用(&)的方式就能改变之前的数组 */public function array_foreach(){ ...

  7. 闪付卡(QuickPass)隐私泄露原理

    0×00 前言 说到闪付卡,首先要从EMV开始,EMV是由Europay,MasterCard和VISA制定的基于IC卡的支付标准规范.目前基于EMV卡的非接触式支付的实现有三个:VISA的payWa ...

  8. linux查找指定目录文件大小

    #遍历查询 /users/yyqh01/ 目录下的文件目录大小,按M打印大小 for i in $(echo /users/yyqh01/*/) ; do [ "$i" != &q ...

  9. latex如何定义宏,插图统一尺寸减少工作量

    问题背景是这样的,因为我要在文中插入一系列的图片,但是这些图片的大小我要保持一致,来达到预期的效果. 比如我有三个figure,这三个figure中,每个figure里面有两行,5列图片,我想要的是, ...

  10. 前端框架Angular、react、vue在github上的数据统计-2018-05

    2018年5月31日09:15:45 突然想看看几个前端框架的数量,然后就截图了如下数据: 分析: react关注.收藏.Fork都高vue一些, 但相差不大 angular比较奇葩,收藏只有二者一半 ...