前言

  其实前面一篇数据备份已经是非常的详细了,这里我想单独的讲解一下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. 结对编程-四则运算生成程序-GUI界面

    201421123118 张中结 201421123098 胡丹丹 a.需求分析 这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一个有基本功 ...

  2. 团队作业8——Beta 阶段冲刺7th day

    一.当天站立式会议 二.每个人的工作 (1)昨天已完成的工作(具体在表格中) 完善支付功能 (2)今天计划完成的工作(具体如下) 测试与正式发布 (3) 工作中遇到的困难(在表格中) 成员 昨天已完成 ...

  3. 【Beta】阶段 第五次Daily Scrum Meeting

    每日任务 1.本次会议为第五次 Meeting会议: 2.本次会议在周五下午15:35,在禹洲楼召开,召开本次会议为10分钟. 一.今日站立式会议照片 二.每个人的工作 (有work item 的ID ...

  4. 201521123079《java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 这题主要是对函 ...

  5. 201521123066《Java程序设计》第七周学习总结

    第7周-集合 本周学习总结 其他注意点: (1)List主要特征: 其元素以线性方式存储 集合中允许存放重复对象 (2)Set中的对象: 不按特定方式排序 没有重复对象 Set最多有一个null元素 ...

  6. 控制结构(8) 线性化(linearization)

    // 上一篇:管道(pipeline) // 下一篇:程序计数器(PC) "编程语言不过是一个工具,什么语言都一样","编程语言能改变人的思维,不同的语言会带给你不同的思 ...

  7. 201521123062《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中fin ...

  8. 201521123054《java程序设计》第12周学习总结

    1. 本周学习总结 2. 书面作业 1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) 1.1 生成的三个学生对象,使用PrintWriter的printl ...

  9. 201521123110《Java程序设计》第12周学习总结

    1. 本周学习总结 2. 书面作业 1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) 1.1 生成的三个学生对象,使用PrintWriter的printl ...

  10. 201521123085 《java程序设计》 第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...