mysqldump

mysqldump 深入浅出

https://juejin.im/post/6844903653183062030

mysqldump

mysqldump 是用于转存储 mysql 数据库的实用程序。

主要产生一个 SQL 脚本,其中包含从头重新创建数据库的所有命令。

导出脚本过程大概如下:创建数据库判断语句、删除表、创建表、锁表、禁用索引、插入数据、启用索引、解锁表。

快速使用

# game 是库名# 完整导出一个库# 包括建库语句、表结构、数据mysqldump -uroot -proot --host=127.0.0.1 --port=3306 --databases game > test.sql# 只导出表结构mysqldump -uroot -proot --host=127.0.0.1 --port=3306-dgame > test.sql# 只导出数据mysqldump -uroot -proot --host=127.0.0.1 --port=3306 -t game > test.sql# 导出一个数据库中多个表的数据和结构mysqldump -uroot -proot --host=127.0.0.1 game --tables articles users > test.sqlmysqldump -uroot -proot --host=127.0.0.1 game articles users > test.sql# 恢复导出数据mysql -u username -proot databse < backup.sql复制代码

参数

--user=user_name, -u user_name

连接数据库的用户名。

--password=password, -p[password]

连接数据库的密码,如果使用 -p 缩写,和密码之间不能有空格。

--opt or --compact

使用 --opt 等于使用这些参数 --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick, and --set-charset,默认情况下即使不加 --opt 参数也是开启的。

使用 --compact 等于使用这些参数 --skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys, and --skip-set-charset,默认不开启。

--databases, -B

指定导出的库名。

--all-databases

表示导出所有的库。

--tables

会覆盖 --databases or -B 选项,指定导出某个表就会忽略库选项。

--no-data, -d

不导出数据,只导出表结构。

Do not dump table contents

--no-create-info, -t

只导出数据,不导出表结构,不添加 CREATE TABLE 语句。

--no-create-db, -n

不添加 CREATE DATABASE 建库语句。

--routines, -R

导出存储过程以及自定义函数

实例

// 导出一个数据库// 包括建库语句、删表语句、建表语句、插入数据mysqldump -uroot -proot--host=127.0.0.1 --port=3306 --databases game > test.sqlCREATEDATABASE/*!32312 IF NOT EXISTS*/`game`/*!40100 DEFAULT CHARACTER SET latin1 */;USE`game`;---- Table structure for table `address`--DROPTABLEIFEXISTS`address`;CREATETABLE`address`(        ...)LOCKTABLES`address`WRITE;/*!40000 ALTER TABLE `address` DISABLE KEYS */;INSERTINTO.../*!40000 ALTER TABLE `address` ENABLE KEYS */;UNLOCKTABLES;...// -d 不导出数据,导出所有的建表删表语句,不包括建库语句,mysqldump -uroot -proot--host=127.0.0.1 --port=3306 -d game > test.sqlDROPTABLEIFEXISTS`address`;/*!40101 SET @saved_cs_client    = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;CREATETABLE`address`(        ...)// -t 不导出结构,导出所有表中的数据,不包括建库语句,都是插入语句mysqldump -uroot -proot--host=127.0.0.1 --port=3306 -t game > test.sqlLOCKTABLES`address`WRITE;/*!40000 ALTER TABLE `address` DISABLE KEYS */;/*!40000 ALTER TABLE `address` ENABLE KEYS */;UNLOCKTABLES;// 导出一个数据库的表结构以及数据,不包括建库语句mysqldump -uroot -proot--host=127.0.0.1 --port=3306 game > test.sql// 导出多个数据库的表结构以及数据,包括建库语句mysqldump -uroot -proot--host=127.0.0.1 -B game game2 > test.sql// 导出多个数据库的结构,包括建库语句mysqldump -uroot -proot--host=127.0.0.1 -d -B game game2 > test.sql// 导出多个数据库的数据,包括建库语句mysqldump -uroot -proot--host=127.0.0.1 -t -B game game2 > test.sql复制代码

导出某个表

// 导出一个数据库中一个表的结构,导出 articles 表的结构和数据mysqldump -uroot -proot--host=127.0.0.1 game articles > test.sql// 导出一个数据库中多个表的数据和结构mysqldump -uroot -proot--host=127.0.0.1 game --tables articles users > test.sqlmysqldump -uroot -proot--host=127.0.0.1 game articles users > test.sql// 导出一个数据库中多个表的结构mysqldump -uroot -proot--host=127.0.0.1 -d game articles users > test.sql// 导出一个数据库中多个表的数据mysqldump -uroot -proot--host=127.0.0.1 -t game articles users > test.sql复制代码

数据表条件导出

// 导出 articles 表 id = 1 的数据mysqldump -uroot -proot --host=127.0.0.1 --where='id=1' game articles > test.sql复制代码

忽略某张表

--ignore-table database.tableName复制代码

多次添加忽略多张表。

导入某个表数据脚本

# 数据来源src_user="root" # 用户名src_password="root" # 密码src_host="localhost" # Hostsrc_port="3306" # 端口src_database="test" # 数据库名src_table="edu" # 表名# 数据导入的数据库配置dst_user="root" # 用户名dst_password="root" # 密码dst_host="localhost" # Hostdst_port="3306" # 端口dst_database="test" # 数据库名mysqldump --host=$src_host --port=$src_port -u$src_user -p$src_password $src_database --tables $src_table | mysql --host=$dst_host --port=$dst_port -u$dst_user -p$dst_password $dst_database复制代码

备份脚本

#!/bin/bash# 以下配置信息请自己修改mysql_user="root" #MySQL备份用户mysql_password="root" #MySQL备份用户的密码mysql_host="localhost"mysql_port="3306"mysql_charset="utf8mb4" #MySQL编码backup_db_arr=("db1" "db2") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3")backup_location=/var/www/mysql  #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹expire_backup_delete="OFF" #是否开启过期备份删除 ON为开启 OFF为关闭expire_days=3 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效# 本行开始以下不需要修改backup_time=`date +%Y%m%d%H%M`  #定义备份详细时间backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期backup_dir=$backup_location/$backup_Ymd  #备份文件夹全路径welcome_msg="Welcome to use MySQL backup tools!" #欢迎语# 判断MYSQL是否启动,mysql没有启动则备份退出mysql_ps=`ps -ef |grep mysql |wc -l`mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then        echo "ERROR:MySQL is not running! backup stop!"        exitelse        echo $welcome_msgfi# 连接到mysql数据库,无法连接则备份退出mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password < $backup_dir/$dbname-$backup_time.sql.gz`                        flag=`echo $?`                        if [ $flag == "0" ];then                                echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"                        else                                echo "database $dbname backup fail!"                        fi                                        done        else                echo "ERROR:No database to backup! backup stop"                exit        fi        # 如果开启了删除过期备份,则进行删除操作        if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then                #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;`                `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf`                echo "Expired backup data delete complete!"        fi        echo "All database backup success! Thank you!"        exitfi复制代码

修改shell脚本的属性:

chmod 600 /root/mysql_backup.shchmod +x /root/mysql_backup.sh复制代码

设置好属性之后,把命令加入 crontab,设置每天 00:00 定时自动备份。

00 00 * * * /path/to/mysql_backup.sh复制代码

恢复备份

mysql -u username -proot databse < backup.sql

// 和建库语句一起导入

mysql -uroot -proot --host=127.0.0.1 --port=33006  < global.sql

或者

mysql -u root -p

use dbname;

source dbname.sql

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