前言

  其实前面一篇数据备份已经是非常的详细了,这里我想单独的讲解一下mysqldump,相信很多程序员都是用过这个命令的!

一、MySQL数据库的备份与还原

1.1、MySQL数据库备份

  1)语法

  mysqldump -u username -p db_name table1 table2 ...> xxx.sql

    含义:

      db_name参数:表示数据库的名称;
      table1和table2参数:表示需要备份的表的名称,为空则整个数据库备份;
      xxx.sql参数:表设计备份文件的名称,文件名前面可以加上一个绝对路径。通常将数据库被分成一个后缀名为sql的文件;

  2)备份多个数据库和所有数据库

  mysqldump -u username -p --databases db_name1 db_name2 > xxx.sql
  mysqldump -u username -p -all-databases > xxx.sql

1.2、MySQL数据库还原

  1)语法 

  mysql -u root -p [dbname] < xxx.sql   

    含义:

      [dbname]如果不指定的话,表示还原所有数据库。

注意:复制整个数据库目录也可以备份数据库,也是最直接有效的方式,但是只适用于使用了MyISAM引擎的数据库,不适用于使用了InnoDB引擎的数据库。  

   数据库还原还可以使用:

    mysql -uroot -p
    source Backup.sql;

二、实战使用mysqldump

2.1、数据库备份

  1)查看所有的数据库

    

  2)备份db_love、db_test

    

2.2、数据库还原

  1)删除数据库db_love、db_test

    

    

  2)进行数据恢复

    这里恢复db.sql中所有的数据库

    

  3)查询是否恢复

    

三、MySQL数据备份脚本(一)

1)备份脚本

#!/bin/bash
#created by yangqiqi -- #创建备份用户
#grant select,lock tables,reload,super,file,show view on *.* to 'mysqlbackup'@'localhost' identified by 'mysql_ritto';
#grant execute on *.* to 'mysqlbackup'@'localhost' identified by 'mysql_ritto'; 授予调用存储过程的权限
##flush privileges;
USERNAME=xxxxxx #备份的用户名
PASSWORD=xxxxxx #备份的密码
HOST=localhost #备份主机 DATE=`date +%Y-%m-%d` #用来做备份文件名字的一部分
OLDDATE=`date +%Y-%m-%d -d '-10 days'` #本地保存天数 MYSQL=/usr/local/mysql/bin/mysql
MYSQLDUMP=/usr/local/mysql/bin/mysqldump
MYSQLADMIN=/usr/local/mysql/bin/mysqladmin #创建备份的目录和文件
BACKDIR=/data/backup/db
[ -d ${BACKDIR} ] || mkdir -p ${BACKDIR}
[ -d ${BACKDIR}/${DATE} ] || mkdir ${BACKDIR}/${DATE}
[ ! -d ${BACKDIR}/${OLDDATE} ] || rm -rf ${BACKDIR}/${OLDDATE} #保存10天 多余的删除最前边的
#开始备份 列出备份的数库
for DBNAME in mysql test test1 test2 test3 ##依次罗列需要备份的数据库
do
${MYSQLDUMP} -B -u${USERNAME} -p${PASSWORD} ${DBNAME} | gzip > ${BACKDIR}/${DATE}/${DBNAME}-backup-${DATE}.sql.gz # -B 备份存储过程
logger "${DBNAME} has been backup successful - $DATE"
/bin/sleep
done

2)备份样式

[root@xxx db]# ls
--
[root@xxx db]# cd --/
[root@xxx --]# ls
mysql-backup---.sql.gz test2-backup---.sql.gz test-backup---.sql.gz
test1-backup---.sql.gz test3-backup---.sql.gz

3)Logger分析

logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。
日志的级别
日志的级别分为七级,从紧急程度由高到底:
emerg 系统已经不可用,级别为紧急
alert 警报,需要立即处理和解决
crit 既将发生,得需要预防。事件就要发生
warnig 警告
err 错误信息,普通的错误信息
notice 提醒信息,很重要的信息
info 通知信息,属于一般信息
debug 这是调试类信息

4)上边的脚本备份完毕后  就可以在   看到每个数据库备份的信息  logger的作用

[root@xxx --]# tail -f /var/log/messages
Aug :: xxx root: test has been backup successful - --
Aug :: xxx root: test1 has been backup successful - --
Aug :: xxx root: test2 has been backup successful - --
Aug :: xxx root: test3 has been backup successful - --
Aug :: xxx root: mysql has been backup successful - --
Aug :: xxx root: test has been backup successful - --
Aug :: xxx root: test1 has been backup successful - --
Aug :: xxx root: test2 has been backup successful - --
Aug :: xxx root: test3 has been backup successful - --

  注意:

    调用存储过程时报了下面的错误
      ERROR 1370 (42000): execute command denied to user backupAccount@'localhost' for routine 'databaseName.spName'
    解决方法:
      grant execute on *.* to 'mysqlbackup'@'localhost' identified by 'mysql_ritto'; 

5)数据库备份完毕后,可能有 需要把备份的文件传输到一个专门用来放备份文件的服务器上 。(sync:实现远程同步功能的软件)

  举例: 

    每天凌晨1点把 A服务器上/data/backup/db/下的数据备份文件放到 B服务器里的/data/backup/db_192.168.1.11/目录下 
    不是累加 是增量更新 (--delete)
  A服务器:
    数据源服务器

    yum install rsync

    打开防火墙 关闭seLinux

 -A INPUT -p tcp -m state --state NEW -m tcp --dport  -j ACCEPT

  B服务器:

 ssh-keygen

    把公钥文件里的id_rsa.pub内容复制到 A服务器里的authorized_keys 
    文件中准备脚本文件

#!/bin/bash
usr/bin/rsync -avz --delete -e "ssh -p 4396" root@192.168.1.11:/data/backup/db /data/backup/db_192.168.1./
logger "Successful backup file transfer - $DATE"

    采用的是 拉push的政策在B服务器上将需要的数据源从A服务器上拉下来

四、MySQL数据备份脚本(二)

4.1、结合Linux的cron命令实现定时备份

  比如需要在每天凌晨1:30备份某个主机上的所有数据库并压缩dump文件为gz格式,那么可在/etc/crontab配置文件中加入下面代码行:

  * * * root mysqldump -u root -pPASSWORD --all-databases | gzip > /mnt/disk2/database_`date '+%m-%d-%Y'`.sql.gz

  前面5个参数分别表示分钟、小时、日、月、年,*号表示任意。 date '+%m-%d-%Y'得到当前日期的MM-DD-YYYY格式。

4.2、一个完整的Shell脚本备份MySQL数据库示例 

#vi /backup/backup.sh

#!bin/bash
cd /backup
echo "You are in backup dir"
mv backup* /oldbackup
echo "Old dbs are moved to oldbackup folder"
File = backup-$Now.sql
mysqldump -u user -p password database-name > $File
echo "Your database backup successfully completed"

  上面脚本文件保存为backup.sh,并且系统中已经创建两个目录/olcbackup和/backup。每次执行backup.sh时都会先将/backup目录下所有名称为backup开头的文件移到/oldbackup目录。   

  为上述脚本制定执行计划如下:

#crontab -e
* * * /backup.sh

4.3、mysqldump全量备份+mysqlbinlog二进制日志增量备份

  从mysqldump备份文件恢复数据会丢失掉从备份点开始的更新数据,所以还需要结合mysqlbinlog二进制日志增量备份。

  确保my.ini或者my.cnf中包含下面的配置以启用二进制日志,或者mysqld ---log-bin:

[mysqld]
log-bin=mysql-bin

  mysqldump命令必须带上--flush-logs选项以生成新的二进制日志文件:

mysqldump --single-transaction --flush-logs --master-data= > backup.sql

  这样生成的增量二进制日志文件比如为mysql-bin.000003,那么恢复数据时如下:

shell> mysql -uroot -pPwd < backup_sunday_1_PM.sql
shell> mysqlbinlog mysql-bin. | mysql -uroot -pPwd

  此外mysqlbinlog还可以指定--start-date--stop-date--start-position--stop-position参数,

  用于精确恢复数据到某个时刻之前或者跳过中间某个出问题时间段恢复数据,直接摘录MySQL文档说明中相关内容如下:

    5.9.3.1. 指定恢复时间 对于MySQL 4.1.4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。

    举例说明,假设在今天上午10:00(今天是2005年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入: mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456
    | mysql -u root -pmypwd 该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要恢复后面发生的活动。

    根据这些,你可以用起使日期和时间再次运行mysqlbinlog:
    mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456
    | mysql -u root -pmypwd
    在该行中,从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。
    5.9.3.2. 指定恢复位置 也可以不指定日期和时间,而使用mysqlbinlog的选项--start-position和--stop-position来指定日志位置。它们的作用与起止日选项相同,不同的是给出了从日志起的位置号。

    使用日志位置是更准确的恢复方法,特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号,可以运行mysqlbinlog寻找执行了不期望的事务的时间范围,但应将结果重新指向文本文件以便进行检查。

    操作方法为: mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00"
    /var/log/mysql/bin.123456 /tmp/mysql_restore.sql 该命令将在/tmp目录创建小的文本文件,将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件,寻找你不要想重复的语句。

    如果二进制日志中的位置号用于停止和继续恢复操作,应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后,你应从命令行输入下面内容:
      mysqlbinlog --stop-position="368312" /var/log/mysql/bin.123456
      | mysql -u root -pmypwd
      mysqlbinlog --start-position="368315" /var/log/mysql/bin.123456
    | mysql -u root -pmypwd \ 上面的第1行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。

    因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句,恢复的数据和相关MySQL日志将反应事务执行的原时间。

MySQL(十五)之数据备份中mysqldump详解的更多相关文章

  1. Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)

    一.介绍           今天继续redis-cli使用的介绍,上一篇文章写了一部分,写到第9个小节,今天就来完成第二部分.话不多说,开始我们今天的讲解.如果要想看第一篇文章,地址如下:http: ...

  2. python接口自动化(二十四)--unittest断言——中(详解)

    简介 上一篇通过简单的案例给小伙伴们介绍了一下unittest断言,这篇我们将通过结合和围绕实际的工作来进行unittest的断言.这里以获取城市天气预报的接口为例,设计了 2 个用例,一个是查询北京 ...

  3. 30个mysql千万级大数据SQL查询优化技巧详解

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. python接口自动化(二十五)--unittest断言——下(详解)

    简介 本篇还是回归到我们最初始的话题,想必大家都忘记了,没关系看这里:传送门  没错最初的话题就是登录,由于博客园的登录机制改变了,本篇以我找到的开源免费的登录API为案例,结合 unittest 框 ...

  5. python接口自动化(十五)--参数关联接口(详解)

    简介 我们用自动化新建任务之后,要想接着对这个新建任务操作,那就需要用参数关联了,新建任务之后会有一个任务的Jenkins-Crumb,获取到这个Jenkins-Crumb,就可以通过传这个任务Jen ...

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

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

  7. WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

    原文:WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用 [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经> ...

  8. MySQL 分区表原理及数据备份转移实战

    MySQL 分区表原理及数据备份转移实战 1.分区表含义 分区表定义指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现 ...

  9. Mysql 多主一从数据备份

    Mysql 多主一从数据备份 概述 对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库中的数据一致. 这样做有如下几点好处: 可以做灾备,其中一个坏了可以切换到另一个. 可以做负载均 ...

随机推荐

  1. WPF的TextBox水印效果详解

    一种自以为是的方式: 本来只是想简单的做个水印效果,在文本框内容为空的时候提示用户输入,这种需求挺常见.网上一搜 都是丢给你你一大段xaml代码.用c#代码实现我是不倾向了 既然用wpf就得Xaml啊 ...

  2. 转: 【Java并发编程】之三:线程挂起、恢复与终止的正确方法(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17095733 挂起和恢复线程     Thread 的API中包含两个被淘汰的方法,它们用 ...

  3. 201521123013 《Java程序设计》第11周学习总结

    1. 本章学习总结 2. 书面作业 Q1.1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥 ...

  4. 201521123045java课程设计---定时器

    #课程设计--定时器(201521123045 郑子熙) 1.团队课程设计博客链接 http://www.cnblogs.com/chendajia/p/7065730.html 2.个人负责模块或任 ...

  5. SVN不出现绿色对勾的情况

    就目前而言,我出现了两种情况. Num1:电脑云盘可能不兼容,导致无法出现svn提示小icon:----->删除云盘重新启动. Num2:被设置覆盖.----->鼠标右键-->Tor ...

  6. 多线程面试题系列(5):经典线程同步 关键段CS

    上一篇提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题.本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的实现机制与原理.关键段CRITIC ...

  7. Vue跨门槛系列之实例的阐述

    学习.使用中结合vue官网的api和教程极佳! 前前篇文章上有提及到vue的简单介绍,详情请戳这里 (初试 Vue.js)  第一部分: 每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue ...

  8. 03标准对象-01-Date和JSON

    0.写在前面的话 在JS世界中,一切都是对象,区别对象类型使用tyepof,返回一个字符串,如: typeof 123; // 'number' typeof NaN; // 'number' typ ...

  9. mysql 安装-zip版

    1.千万不要自己新建data,使用命令:mysqld --initialize会自动生成一大堆文件 2.没有ini文件就自己新建:

  10. Maven实战1

    屏上得来终觉浅,绝知此事要躬行 总结: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; c ...