SQL 导入、导出、备份

MySQL与SqlServer备份有区别,以下以MySql为例。
导出的文件有两种,一种为数据文件,包括csv、txt、xml、json、dbf文件等,直接记录了数据。另一种为SQL脚本文件,内容为可执行的sql语句,执行后生成数据。通常使用后者。

二进制日志 binlog

主要用于数据库的主从复制(master开启binlog,传递给slave)和增量备份(mysqlbinlog,用于实现基于时间点的数据恢复 )。

开启后即实现了增量备份,会产生约1%的性能损耗。
如无主从关系且仅做全量备份,则可以不开启。

  • 二进制日志索引文件
    文件名后缀为.index,用于记录所有的二进制文件
  • 二进制日志文件
    文件名后缀为.00000*,以事务形式记录数据库所有非查询的操作语句。
    每条记录是从一个【at 数字】开始到一个【at 数字】结束,之间是一条二进制日志记录。每条记录的end_log_pos值与记录结束的at后的值是一致的。
落盘频次

通过sync_binlog配置binlog落盘的时机
通常配置为0或100,牺牲一定的一致性获取更好的性能。

  • 0,表示MySQL不控制binlog的刷新,由文件系统去控制它缓存的刷新。
  • 正整数,表示每sync_binlog次事务后,保存binlog到磁盘。
    其中,默认值1最安全,即系统故障时最多丢失一个事务的更新。
开启binlog
  1. 查看binlog状态,其中 log_bin 为 OFF 则表示未开启
show variables like 'log_bin';
select @@log_bin;
show variables like '%binlog%';
  1. 修改配置文件,重启mysql使配置生效
  • Windows:mysql/my.ini
  • Linux:根据系统环境和mysql版本不同,配置文件可能不同。
    /etc/my.cnf/etc/mysql/my.cnf/etc/mysql/mysql.cnf,或其中指向了另一个配置文件,如/etc/mysql/mysql.conf.d/mysqld.cnf
# 必要配置
server-id = 1 # 【当前机器的服务 ID(如果是集群,则不能重复)】
log_bin = /var/log/mysql/mysql-bin # 【开启binlog并配置日志存放路径】

# 其他配置
binlog_format = MIXED #【设置日志格式,主从复制时建议使用 ROW 或 MIXED】
# 【在ROW/MIXED模式下,除了数据变化,也在注释中记录SQL。默认为0不记录SQL】
binlog-rows-query-log_events=1
# 【一般不记录mysql库,用户名和密码信息在mysql数据库中】
binlog-ignore-db=mysql
binlog-ignore-db=sys

# 【设置binlog清理时间】
expire_logs_days = 7
# 【设置binlog每个日志文件的最大大小(事务不会跨文件记录,因此可能会超过该值)】
max_binlog_size = 100m
# 【设置binlog缓存大小】
binlog_cache_size = 4m
# 【最大binlog缓存大小,多语句事务所有session内存相加的最大值】
max_binlog_cache_size = 512m
binlog_format
  • STATMENT
    基于SQL语句的复制,只记录语句,不记录值,体积较小。
    但相同语句在不同的环境可能有不同结果,不应在主从复制时使用
  • ROW
    基于行的复制,只记录修改前后的值(前镜像、后镜像),不记录语句,可靠性高
    即使只修改了某个字段,也会记录整个行,因此体积较大。
    • binlog_row_image 默认为FULL,前后镜像都记录整行。可以通过改为 MINIMAL 只记录列以压缩体积,但会导致无法canal和闪回(flashback),不建议使用。
    • binlog-rows-query-log_events 默认为0,不记录SQL日志。如改为1,则在注释中通过Rows Query Event记录SQL日志。通过mysqlbinlog查看时需要使用参数-vv
  • MIXED
    混合格式,默认采用STATMENT,对STATEMENT可能无法精确复制的内容采用ROW。因此上述ROW的相关参数也能对MIXED生效。
查看binlog
show master logs;
show binary logs;
show binlog events;
show master status;
show slave status;#查看作为从机的状态
  • 通过mysqlbinlog将binlog文件转成SQL语句预览或导出
    其中ROW格式的日志无法转化为SQL语句,可通过-v参数转化为类SQL语句注释
mysqlbinlog /var/lib/mysql/mysql-bin.000002
mysqlbinlog -v --start-position=509 --stop-postion=845 /var/lib/mysql/mysql-bin.000001
mysqlbinlog -d 数据库名称 日志文件名
mysqlbinlog -r 日志文件名 文本文件名;
mysqlbinlog 日志文件名 > 文本文件名;
刷新binlog

结束当前binlog日志,创建新日志文件记录后续改动。

flush logs;

使用语句导入、导出

导出数据(全量备份)

生成一个.sql脚本,其中包含了创建数据的指令

mysqldump -u 用户名 -p 密码 数据库名 表名 > 保存路径
mysqldump -uroot -p123456 -A -F -R --events --single-transaction --master-data=2 | gzip > /data_bak/db_bak_000001.sql.gz 
  • 无密码则-p后不加内容即可
  • 如需远程备份,通过-h-P指定IP地址和端口号
  • 如需压缩,则在>前加入| gzip,如| gzip > /db_bak.sql.gz
  • 如需备份整个数据库,则不填表名
  • 如需备份所有数据库,则用参数--all-databases-A代替数据库名
  • 如需备份多个数据库,则用参数--databases-B,其后多个数据库名以空格分隔
  • 如需备份多个表,则用参数--tables,其后多个表名以空格分隔
mysqldump -uroot -p --databases wgx hist > /tmp/d1d2.sql
  • --flush-logs-F:结束当前binlog日志,创建新日志文件记录后续改动。
  • --quick-q:(默认已开启),从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
  • --routines-R:备份存储过程和自定义函数
  • --events:导出事件
  • --single-transaction:用于事务表(InnoDB),保证一致性
    本质上是设置本次会话为repeatable read
  • --lock-all-tables-x:用于非事务表(MyISAM),保证一致性
  • --master-data=2:在导出的SQL文件中,生成当时的binlog文件名及其Position的注释
  • --no-data:只导出表结构,不导出数据
  • --where-w:数据筛选条件
导入数据(全量恢复)
# 直接导入
mysql -u 用户名 -p 密码 数据库名 表名 < 来源文件
# 也可以进入mysql命令行后导入:
source /data_bak/13.sql;
# 也可以在外直接使用mysql命令行导入:
mysql -uroot -p123456 -e "source /data_bak/13.sql;"
导入数据(全量恢复 + 增量恢复)
  1. 执行flush logs;创建新的binlog文件。
  2. 找到上次备份产生的.sql文件。
  3. 找到步骤2文件中,因–master-data=2记录的对应binlog文件(如 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=154; ),并将其及其之后的所有binlog文件(不包括步骤1中新建的文件)都拷贝到其他目录进行备份。
  4. 通过mysqlbinlog -v预览步骤3中文件,在其中找到需要备份位置的Position
  5. 对步骤2中文件进行全量恢复
mysql -uroot -p123456 < /data_bak/db_bak_2020-07-04.sql 
  1. 将步骤3中文件转为SQL,直到步骤4中Position,并执行以实现增量恢复
mysqlbinlog --stop-position=2397 /var/lib/mysql/mysql-bin.000012 > /data_bak/12.sql
mysqlbinlog  /var/lib/mysql/mysql-bin.000013 > /data_bak/13.sql
mysql -uroot -p123456 < /data_bak/12.sql
mysql -uroot -p123456 < /data_bak/13.sql
恢复数据(flashback 闪回)

通过将binlog内容全部取反,直接进行相反的SQL指令以实现数据恢复,比全量恢复 + 增量恢复方案更快捷高效。
仅在binlog_format=ROWbinlog_row_image=FULL时可用。
通常通过FlashBack或MyFlash工具实现。

案例一:编写一个mysqldump分表备份脚本
>vim backup_tables.sh

#!/bin/bash
#利用for循环取出数据库中所有的表名称,并过滤掉标题行
for tablename in `mysql -uroot -p123456 hist -e "show tables;"|grep -Evi "table"`
do
    # 针对每个表名称生成相应的mysqldump命令
    mysqldump -uroot -p123456 --events hist $tablename|gzip > /tmp/${tablename}_bak.sql.gz
done

>chmod +x backup_tables.sh
>ll
>./backup_tables.sh 
案例二:Linux使用crontab定时备份并上传OSS(windows则用任务计划)

cron有两个配置文件,一个是全局配置文件(/etc/crontab),一个是每个用户通过crontab -e直接操作的配置文件(/var/spool/cron/当前用户名

  • 查看配置文件:crontab -l
  • 编辑配置文件(vim):crontab -e 或直接编辑配置文件
    配置文件内容:如0 3 * * * sh /www/ql_backend_pro/backup/backup.sh,表示每年每月每日03:00用shell执行backup.sh文件(shell文件必须以#!/bin/bash开头)
  • crontab 的执行记录会写入到/var/log/cron,以帐号为区分
  • 使用ossutil64工具保存到OSS较为方便。
    此外也可以使用scp命令保存到其他服务器。注意配置ssh免密钥登录,否则无法作为脚本自动执行。
#!/bin/bash
#保存备份个数,备份31天数据
number=31

#备份保存路径
backup_dir=/www/ql_backend_pro/backup

#日期
dd=`date +%Y-%m-%d-%H-%M-%S`

#备份工具
tool=mysqldump

#用户名
username=root

#密码
password=vl1qaz@WSX

#将要备份的数据库
database_name=chinaduancai_pro

#如果文件夹不存在则创建
if [ ! -d $backup_dir ];
then
mkdir -p $backup_dir;
fi
$tool -u $username -p$password $database_name > $backup_dir/$database_name-$dd.sql

# 备份到OSS
/www/ossutil64 cp $backup_dir/$database_name-$dd.sql oss://chinaduancai-backup/sql/

#写创建备份日志
echo "create $backup_dir/$database_name-$dd.sql" >> $backup_dir/log.txt

#找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | head -1`

#判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | wc -l`
if [ $count -gt $number ]
then

#删除最早生成的备份,只保留number数量的备份
rm $delfile

#写删除文件日志
echo "delete $delfile" >> $backup_dir/log.txt
fi


使用Navicat进行本地导入、导出和备份

注意,Navicat的导出和备份都只能保存在本地

从本地导入

右击数据库,选择“运行SQL文件”

导出到本地

右击数据库,选择“转储SQL文件”
或选中表,选择“导入”或“导出”(可用于导出搜索结果或临时表)

导出到本地
备份到本地

选择数据库-备份-新建备份-备份(备份文件位于编辑连接-高级-设置位置中)
在最后一步不选择备份,而选择保存,可以保存为一个自定义备份配置文件,供批处理任务调用

通过批处理作业定时备份到本地

本质上是用了windows的任务计划,无需navicat保持连接,但需要开机状态

  • 创建一个批处理作业
    选择数据库-自动运行-新建批处理作业-保存
    可通过设置触发器来设置自动执行的时间

  • 为批处理作业添加任务
    选中批处理作业-备份-选择数据库-选择可用的工作-保存
    可用的工作默认备份整个数据库,也可以在新建备份时创建自定义备份配置文件,在此处可选择

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