代码改变世界

【MySQL】mysqldump使用指南

2022-08-01 14:02  abce  阅读(395)  评论(0编辑  收藏  举报

1.mysqldump不会备份sys库。但在使用mysqldump在执行--all-databases会清空mysql.proc导致sys无法正常使用;这是一个BUG,并且只存在于MySQL 5.7.x


2解决方案:
(1)mysql_upgrade install or upgrade sys schema
这个方案适用于sys库已经因为mysqldump导入而损坏的情况下使用。

# 删除 sys schema (An error occurs if a sys schema exists but has no version view)
mysql> DROP DATABASE sys;

# 这个时候 sys schema 不应该存在
mysql> SHOW DATABASES;

# 最后,执行 mysql_upgrade sys schema 以恢复正常
mysql_upgrade --upgrade-system-tables --skip-verbose --force

mysql> SHOW DATABASES;
mysql> SELECT COUNT(*) FROM mysql.proc;

注意:mysql_upgrade 在修理 sys 库的同时,还修理 mysql 库和用户库表(期间加锁且速度一般),有极小可能会误伤;使用 mysql_upgrade 的时候要加上 --upgrade-system-tables,不然会扫描用户库表。

(2)全备时同时备份 sys 库

这个方案适用于需要还原的数据库,sys 库也不太正常的情况下使用;在全备后额外再备份一份 sys 库用于修复。

mysqldump -A --set-gtid-purged=OFF --master-data=2 --single-transaction --routines --events --triggers  > all.sql
mysqldump --databases --routines sys > sys_dump_`mysql -V|awk '{print $5}'|cut -b 1-6`.sql

注意:不适用于做主从时使用它。
注意:不适用于做主从时使用它。

(3)使用databases全备
这个方案适用于所有场景的全备需求,100% 安全。

select_databases="                                                                 
    SELECT
        GROUP_CONCAT(schema_name SEPARATOR ' ') 
    FROM 
        information_schema.schemata 
    WHERE 
        schema_name NOT IN ('performance_schema','information_schema');"

databases=`mysql -NBe "$select_databases"`
mysqldump --set-gtid-purged=OFF --master-data=2 \
--single-transaction --routines --events --triggers \
--max_allowed_packet=256M  --databases > all.sql

(4)使用 mysql-sys 开源代码
如果你的数据库 sys 全部中招了,又是生产库。那你只能用这个方法;

mysql-sys:
https://github.com/mysql/mysql-sys

中记录了sys库的创建语句将文件下载到本地,然后根据数据库版本,执行以下命令即可。

# 安装前操作,内容是禁用掉 sql_log_bin,不记录到日志中。
mysql> source before_setup.sql

# 创建 sys 库,实际会调用其他文件夹中的 sql 语句
# 来进行表、视图、存储过程、触发器的创建
mysql> source sys_57.sql

# 安装后的操作,内容是将 sql_log_bin 恢复到操作前的状态
mysql> source after_setup.sql

MySQL 8,具体原因是从MySQL 8.0.0起就移除了mysql.proc这张表。


https://www.toutiao.com/article/6894154794278224395/