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/