第7章、备份与恢复

使用mysqldump导出SQL格式的备份

默认情况下mysqldump导出的是标准的SQL语法,因此你可以使用标准输出写入文件。

shell> mysqldump [arguments] > file_name

若需要导出所有数据,如下:

shell> mysqldump --all-databases > dump.sql

若仅导出特定数据库,请在命令行中命名它们,然后使用--databases选项。--databases后的所有名称都将视为数据库名称,若省略该选项则默认取第一个字符串作为数据库的名称。

shell> mysqldump --databases db1 db2 db3 > dump.sql

当使用--all-databases--databases选项时,在具体的数据库导出之前会添加CREATE DATABASEUSE语句。这样可以确保导出的备份在下次被加载之前,若发现库没有创建可以实施创建,不会因此影响数据导入。如果你需要在导入时删除之前的库,可以在导出时添加选项--add-drop-database。这样做可以在声明CREATE DATABASE 之前添加语句DROP DATABASE

导出单个数据库:

shell> mysqldump --databases test > dump.sql

也可以省略--databases标签:

shell> mysqldump test > dump.sql

他们两者的区别是省略--databases标签在导出的数据库脚本中,不会自动添加CREATE DATABASEUSE语句。

省略--databases这意味着你在执行导入时:

  • 需要指定数据库。
  • 你可以将数据导入到与导出指定数据库名称不同的数据库中。
  • 如果你指定的数据库不存在,你需要手动创建。
  • 因为输出将不包含CREATE DATABASE语句,所以--add-drop-database选项不起作用。如果使用它,它不会生成DROP DATABASE语句。

如果仅想导出指定数据库中的指定数据表,可以这样做:

shell> mysqldump test t1 t3 t7 > dump.sql

用mysqldump以分隔文本格式转储数据

若你使用mysqldump --tab={dir-name}时,它会使用{dir-name}作为输出目录。并且每张表将会有两份文件,比如数据库表名称是t1,则对应的输出文件为t1.sqlt1.txt*.txt存放表的数据,一行一条数据。

以下命令将db1数据库的内容转储到/ tmp数据库中的文件:

shell> mysqldump --tab=/tmp db1

*.txt是由mysql的运行的用户持有,因为mysql的用户调用SELECT ... INTO OUTFILE语句写入该文件,所以你需要确保执行该方法的用户具备FILE权限。另外,如果对应的*.txt文件已存在时,导出操作将会报错。

Tips:FILE 权限是一个比较危险的权限,SQL注入之后利用FILE权限可以完成提权,所以处于安全考虑不对外开放该权限。

选项--tab最好仅应用于本地服务器。

要使用不同的格式写入数据文件,mysqldump支持以下选项:

--fields-terminated-by=str
# 分割列的符号 (default: tab).
--fields-enclosed-by=char
# 包围列的字符 (default: no character).
--fields-optionally-enclosed-by=char
# 包围非数据的列字符 (default: no character).
--fields-escaped-by=char
# 用于转义的特殊字符 (default: no escaping).
--lines-terminated-by=str
# 终止符 (default: newline).

在实际使用时,你可以指定Hex也可以使用字符。

--fields-enclosed-by='"'
# 上下是同一个意思
--fields-enclosed-by=0x22

制作数据库备份

3行代码备份一个数据库。

# 不使用 --databases 是避免CREATE 语句导致导入到db2会失败
shell> mysqldump db1 > dump.sql
shell> mysqladmin create db2
shell> mysql db2 < dump.sql

导出存储过程、计划事件、触发器

  • --events : 导出计划事件
  • --routines : 导出存储过程
  • --triggers : 导出触发器

--triggers默认是开启的,其它两个是默认关闭的。如果需要导出,则需要显示的指定。如果明确无需导出,可以设置:--skip-events,--skip-routines,--skip-triggers。

定时备份

有了上面的概念对导出导入有了基本认识,接下去借助crontab即可完成定时备份的效果。

不了解crontab可以参考文档:Configuring Cron Tasks

1. 创建并授权备份用户

CREATE USER 'backup'@'%' IDENTIFIED BY '你的密码'
GRANT SELECT,LOCK TABLES ON *.* TO 'backup'@'%' IDENTIFIED BY '你的密码';

2. 编写备份脚本

#!/bin/bash   

#定义有备份的数据库名 定义远程数据库
dbname="你要备份的数据库名"  dbhost="数据库HOST"

#定义远程数据库端口
dbport=3306

#定义备份数据库时使用的用户名和密码 
dbuser="你的mysql用户名" dbpasswd="你的密码"   
#数据库备份的路径 
backuppath=/home/mysql/${dbhost}/ 
 
#数据库备份日志文件存储的路径 
logfile=/home/mysql/${dbhost}/logs/bak.log   


#以当前的时间作为备份的数据库命名。 
dumpfile=${dbname}-$(date +%Y%m%d%H%M)   


#这个函数用来备份数据库 
back_db() {    
#将备份的时间、数据库名存入日志    
echo "------"$(date +%Y-%m-%d%t%A%t%T)" Beginning database "${dbname}" backup--------" >>${logfile}     


#备份数据库,如果有错误信息也记入日志。   默认utf8编码
/usr/bin/mysqldump -u${dbuser} -p${dbpasswd} -h ${dbhost} -P ${dbport} --default-character-set=utf8 --databases ${dbname} >${backuppath}${dumpfile}.sql 2>> ${logfile}     

#开始压缩数据文件   
echo $(date +%Y-%m-%d%t%A%t%T)" Beginning zip ${backuppath}${dumpfile}.sql" >>${logfile} 
    
#将备份数据库文件库压成ZIP文件,并删除先前的SQL文件。如果有错误信息也记入日志。   
tar zcvf ${dumpfile}.tar.gz ${dumpfile}.sql && rm ${dumpfile}.sql 2>> ${logfile}     

#将压缩后的文件名存入日志。   
echo "backup file name:"${dumpfile}".tar.gz" >>${logfile}   
echo -e "-------"$(date +%Y-%m-%d%t%A%t%T)" Ending database "${dbname}" backup-------\n" >>${logfile}  
}

#发送邮件  
#cat ${logfile} | mutt -s "Blog数据库备份" -a ${dumpfile}.tar.gz 8chf@163.com }   

rm_oldfile() {   
#查找出当前目录下7天前生成的文件,并将之删除   
find ${backuppath} -type f -mtime +7 -exec rm {} \; 
}   

#切换到数据库备份的目录。如果不做这个操作,压缩文件时有可能会错误 
cd ${backuppath}   

#运行备份数据函数 
back_db   

#运行删除文件函数 
rm_oldfile 

3. 设置备份目录

  • 220.*.*.*
    • 约定以mysql服务器host为文件夹,每个host下备份只有该host下的备份。
    • logs 目录存放备份过程的日志。
  • shell 目录下则是备份脚本。
设置备份目录

4. 启用计划任务

若服务器没有安装crontab服务,则使用yum -y install crontab安装即可。

shell > crontab -e 

编辑文件并保存。

15 14 * * *  /home/mysql/shell/bak-220.*.*.*.sh > /dev/null
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 在编写shell脚本的时候,可能会遇到操作mysql数据库的情况。下面介绍如何在shell脚本中操作mysql数据...
    ifcoder阅读 2,514评论 0 2
  • Mysqldump是一个逻辑备份命令;意思就是将数据库中的数据备份成一个文本文件;也可以说是将表的结构和数据存储在...
    温东阅读 828评论 0 1
  • 三生七世,生凡生道生佛陀。一世禽二世兽三世俗,三世生凡。四世贵,五世龙,两世生道。六世三清,七世菩提,两世生佛陀。...
    游吟pote阅读 303评论 0 0
  • 促销手段和促销方式 1、降价式促销 降价式促销就是将商品低于正常的定价出售。其运用方式最常见 的有库存大清仓、节庆...
    看得见的手阅读 1,421评论 0 2