热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL(十五)之数据备份中mysqldump详解

前言其实前面一篇数据备份已经是非常的详细了,这里我想单独的讲解一下mysqldump,相信很多程序员都是用过这个命令的!一、MySQL数据库的备份与还原1.1、MySQL数据库备份1)语法

前言

  其实前面一篇数据备份已经是非常的详细了,这里我想单独的讲解一下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] 

    含义:

      [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
2017-08-24

#创建备份用户
#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 5
done

 

2)备份样式

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

 

3)Logger分析

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

 

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

[root@xxx 2017-08-25]# tail -f /var/log/messages
Aug
25 09:30:06 xxx root: test has been backup successful - 2017-08-25
Aug
25 09:30:11 xxx root: test1 has been backup successful - 2017-08-25
Aug
25 09:30:16 xxx root: test2 has been backup successful - 2017-08-25
Aug
25 09:30:21 xxx root: test3 has been backup successful - 2017-08-25
Aug
25 09:40:02 xxx root: mysql has been backup successful - 2017-08-25
Aug
25 09:40:07 xxx root: test has been backup successful - 2017-08-25
Aug
25 09:40:12 xxx root: test1 has been backup successful - 2017-08-25
Aug
25 09:40:17 xxx root: test2 has been backup successful - 2017-08-25
Aug
25 09:40:22 xxx root: test3 has been backup successful - 2017-08-25

  注意:

    调用存储过程时报了下面的错误
      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 873 -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.11/
logger
"Successful backup file transfer - $DATE"

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

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

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

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

30 1 * * * 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
30 1 * * * /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=2 > backup.sql

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

shell> mysql -uroot -pPwd < backup_sunday_1_PM.sql
shell
> mysqlbinlog mysql-bin.000003 | 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日志将反应事务执行的原时间。

 


推荐阅读
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 我们有(据我所知)星型模式SQL数据库中的数据文件。该数据库有5个不同的文件,扩展名为 ... [详细]
author-avatar
夹uh山下
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有