mysql - AWS RDS MySQL 错误。恢复数据时的场景会生成错误 ERROR 1227(42000)?
问题描述
在 CI/CD 部署环境中存在 MYSQL 恢复错误。此错误是由 AWS RDS MySQL 权限引起的。5.7版本生成一个mysql转储文件,在其他环境用AWS RDS Mysql 5.6版本恢复如如下关系:
MySQL 转储 = 版本:5.7.23 MySQL 还原 = 版本:5.6.40
错误
在 CI/CD 部署工具中得到的错误是:
`Backup format OK
Restoring MySQL
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
Error in hook: post_extract
Hook script failed
Build step 'Execute shell' marked build as failure
Finished: FAILURE`
Basically is just trying to restore a MYSQL dump file `mysql.sql`. The first 20 lines of the backup `mysql.sql` contains the following:
## Mysql.sql dump comments
`
-- MySQL dump 10.13 Distrib 5.7.24, for Linux (x86_64)
-- Server version 5.7.23-log
7 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
8 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
9 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
10 /*!40101 SET NAMES utf8 */;
11 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
12 /*!40103 SET TIME_ZONE='+00:00' */;
13 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
14 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
15 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
16 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
17 SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
18 SET @@SESSION.SQL_LOG_BIN= 0;
19
20 -- GTID state at the beginning of the backup
`
这只是通过以下 mysqldump 代码执行 backup.sh 脚本后生成的普通转储文件,该代码从parameters.yml
文件中传递秘密参数:
`mysqldump > $tmpdir/db-backup/mysql.sql \
--defaults-extra-file=<(cat << EOF
[mysqldump]
user=$mysql_user
password=$mysql_pass
host=$mysql_host
EOF
) \
"$mysql_db" \
|| return 1
获取所需的凭据
parameters_yml=$secrets/config/parameters.yml
get_param() {
sed -r -n "/^ *$1 *:/ {s/^ *$1 *: *(.*)/\1/ ; p}" $parameters_yml
}
mysql_host=$(get_param database_host)
mysql_user=$(get_param database_user)
mysql_pass=$(get_param database_password)
mysql_db=$(get_param database_name)
现在,当评论上述mysql.sql
第 17 行和第 18 行时,恢复过程完美无缺:
restore(){
mysql < $tmpdir/db-backup/mysql.sql \
--defaults-extra-file=<(cat <<EOF
[mysql]
user=$mysql_user
password=$mysql_pass
host=$mysql_host
EOF
) \
"$mysql_db" \
|| return 1
}
这里的问题是:
- 如何传递一些 [可选参数] ( https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html )!到 mysql dump 命令来纠正这种行为?
- 考虑到 AWS RDS 和数据库版本不同,是否有其他建议来处理这个问题?
我一直在一些 AWS RDS 数据库实例中尝试这样做,但没有成功。问题被发现了,是mysql dump生成的mysql.sql文件中那些注释的问题。
该代码包含在问题的描述中。它基本上是一个包含 backup() 和 restore() 函数的 db.sh shell 脚本。
mysql.sql 应该使用这些特定的注释生成。restore() 函数应该成功执行并且永远不会显示错误:第 n 行的错误 1227 (42000):访问被拒绝;您需要(至少一个)超级权限才能执行此操作。
解决方案
在 mysqldump 中注释掉以下行
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; 设置@@SESSION.SQL_LOG_BIN= 0;
设置@@GLOBAL.GTID_PURGED='';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
导入应该成功。
有关更多详细信息,请点击此链接 https://help.poralix.com/articles/mysql-access-denied-you-need-the-super-privilege-for-this-operation
推荐阅读
- python - 标记曲线之间的最大偏差/距离
- ios - Mac 上 SwiftUI 中的 UIDocumentPickerViewController (macCatalyst)
- docker-compose - yaml.parser.ParserError:解析块映射时第 1 行第 1 列
- sql-server - 使用 Oracle DBLink 无法识别视图列
- c++ - 如何处理在源代码中找不到 OpenCV
- swift - 以编程方式在 Reality Composer 生成的场景中设置纹理
- methods - if 语句中的 indexOf 方法
- reactjs - 在 Material-UI 面包屑中使用 React Router DOM 路由
- string - Fortran 函数 num2str
- codenameone - 代号 One 在线编译器和运行器