当前位置:   article > 正文

使用 MySQL Shell 备份MySQL数据库_mysql-shell备份

mysql-shell备份

一 说明

1. MySQL Shell 介绍

MySQL Shell 是 MySQL 的一个高级客户端和代码编辑器, 是第二代 MySQL 客户端. 第一代 MySQL 客户端即我们常用的 mysql

2. MySQL Shell 备份功能

在之前,我们备份MySQL方法有: mysqldump , mypump,mydumper, xtrabackup , mysqlbackup

mysqldump , mypump,mydumper都是逻辑备份, mysqldump可以保证一致性但速度比较慢不能并行, mypump无法获取当前备份对应的binlog位置。基于表进行并行备份,对于大表来说性能较差。mydumper可定制性差

mysqlbackup和xtrabackup 是物理备份, 前者是官方收费软件, 后者是开源软件, 功能雷同但又有差异,各有亮点. 例如mysqlbackup支持的特性多一点, 但是是收费软件. xtrabackup 免费但特性少一点,例如仅支持linux平台

我们最常用的基本上就是mysqldump, 对于不是太大的数据库还是很好用的, 但数据量稍微一上去, 备份时间就很长了.

现在有了MySQL Shell 可以大大解决这个问题

3. MySQL Shell 的安装(以 8.0.31 为例)

yum install mysql-shell-commercial-8.0.31-1.1.el9.x86_64.rpm

4. 登录数据库

可以通过 mysqlsh --help 查看到有很多种连接方法:

  1. $ mysqlsh root@localhost/schema
  2. $ mysqlsh mysqlx://root@some.server:3307/world_x
  3. $ mysqlsh --uri root@localhost --py -f sample.py sample param
  4. $ mysqlsh root@targethost:33070 -s world_x -f sample.js
  5. $ mysqlsh -- util check-for-server-upgrade root@localhost --output-format=JSON
  6. $ mysqlsh mysqlx://user@host/db --import ~/products.json shop

我们此处使用 mysqlsh --uri root@127.0.0.1:3308/mysql 方式, 第一次登录可以保存密码

二 例子

1. 备份例子

util.dumpInstance('/backup/full',{compression: "none"})

  1. Acquiring global read lock
  2. Global read lock acquired
  3. Initializing - done
  4. 1 out of 5 schemas will be dumped and within them 8 tables, 0 views.
  5. 3 out of 6 users will be dumped.
  6. Gathering information - done
  7. All transactions have been started
  8. Locking instance for backup
  9. Global read lock has been released
  10. Writing global DDL files
  11. Writing users DDL
  12. Running data dump using 4 threads.
  13. NOTE: Progress information uses estimated values and may not be accurate.
  14. Writing schema metadata - done
  15. Writing DDL - done
  16. Writing table metadata - done
  17. Starting data dump
  18. 124% (198.22K rows / ~158.99K rows), 133.81K rows/s, 0.00 B/s
  19. Dump duration: 00:00:00s
  20. Total duration: 00:00:01s
  21. Schemas dumped: 1
  22. Tables dumped: 8
  23. Data size: 598.90 MB
  24. Rows written: 198221
  25. Bytes written: 598.90 MB
  26. Average throughput: 598.90 MB/s
  27. 2. 备份产生的内容

@.done.json:会记录备份的结束时间, 备份集的大小. 备份结束时生成

@.json:会记录备份的一些元数据信息, 包括备份时的一致性位置点信息:binlogFile, binlogPosition 和 gtidExecuted, 这些信息可用来建立复制,或用来基于时间点的恢复

@.sql, @.post.sql:这两个文件只有一些注释信息. 导入数据时, 我们可以通过这两个文件自定义一些 SQL. 分别用于数据导入前和数据导入后执行

*.tsv:数据文件. 打开可以查看数据文件的内容

TEST@a_news.json:记录了表相关的一些元数据信息, 如列名, 字段之间的分隔符(fieldsTerminatedBy)等

TEST@a_news.sql:建表语句

TEST.json:记录数据库中已经备份的表、视图、定时器、函数和存储过程

TEST.sql:建库语句. 如果这个库中存在存储过程、函数、定时器, 也是写到这个文件中

@.users.sql:创建账号及授权语句. 默认不会备份 mysql.session, mysql.session, mysql.sys 这三个内部账号

3. 恢复例子

util.loadDump("/backup/full")

  1. Loading DDL and Data from '/backup/full' using 4 threads.
  2. Opening dump...
  3. Target is MySQL 8.0.31. Dump was produced from MySQL 8.0.31
  4. Scanning metadata - done
  5. Checking for pre-existing objects...
  6. Executing common preamble SQL
  7. Executing DDL - done
  8. Executing view DDL - done
  9. Starting data load
  10. 1 thds loading \ 100% (598.90 MB / 598.90 MB), 20.59 MB/s, 7 / 8 tables done
  11. Executing common postamble SQL
  12. Recreating indexes - done
  13. 23 chunks (198.22K rows, 598.90 MB) for 8 tables in 1 schemas were loaded in 50 sec (avg throughput 12.13 MB/s)
  14. 0 warnings were reported during the load.

4. 恢复产生的内容

load-progress.<server_uuid>.progress: 在导入的过程中, 会在备份目录生成一个 progressFile, 用于记录加载过程中的进度信息, 可用来实现断点续传功能

三 命令说明

1. 备份命令

1) 备份实例 其中

util.dumpInstance(outputUrl[, options])

2) 备份指定库的数据. 第一个参数必须为数组, 如 util.dumpSchemas(['TEST'],'/backup/schema')

util.dumpSchemas(schemas, outputUrl[, options])

3) 备份指定表的数据. 第二个参数必须为数组, 如 util.dumpTables('TEST',['t'],'/backup/table')

util.dumpTables(schema, tables, outputUrl[, options])

2. 恢复命令

util.loadDump(url[, options])

3. 不进入mysqlsh, 操作系统命令行执行备份

mysqlsh --uri root@127.0.0.1:3308/mysql -e "util.dumpInstance('/backup/full1')"

四 备份脚本

例如数据库有 TEST1,TEST2 数据库,我比较喜欢每个数据库分别备份, 每天备份,自动覆盖上周的备份, 可以编写以下脚本并加入计划任务

  1. #!/bin/bash
  2. for v_db in TEST1 TEST2
  3. do
  4. v_target=/backup/full/$(date +%w)/${v_db}
  5. [ -d ${v_target} ] && rm -rf ${v_target}
  6. [ -d ${v_target} ] || mkdir -p ${v_target}
  7. mysqlsh --uri root@127.0.0.1:3308/mysql -e "util.dumpInstance('${v_target}')"
  8. done

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/139785
推荐阅读
相关标签
  

闽ICP备14008679号