在CI / CD部署环境中,存在MYSQL还原错误。此错误是由于AWS RDS MySQL权限引起的。在版本5.7中生成一个mysql转储文件,并在其他环境中使用AWS RDS Mysql版本5.6还原该文件,例如以下关系:
MySQL Dump =版本:5.7.23 MySQL Restore =版本: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
}
我一直在没有成功的某些AWS RDS数据库实例中尝试此操作。发现了问题所在,这是由mysql dump生成的mysql.sql文件中的注释所引起的问题。
该代码包含在问题的描述中。 它基本上是一个db.sh shell脚本,包含backup()和restore()函数。
mysql.sql应该使用这些特定注释生成。 restore()函数应该成功执行,并且永远不会显示错误: 第n行的错误1227(42000):访问被拒绝;您需要(至少其中一种)SUPER权限才能进行此操作。
答案 0 :(得分:2)
在mysqldump中注释掉以下几行
SET @MYSQLDUMP_TEMP_LOG_BIN = @@ SESSION.SQL_LOG_BIN; SET @@ SESSION.SQL_LOG_BIN = 0;
SET @@ 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
答案 1 :(得分:1)
没有额外参数的mysqldump会生成一个.sql转储文件,其中带有多余的注释,这些注释不会使转储具有可移植性。
在mysqldump命令中添加buildscript {
ext.kotlin_version = '1.3.21'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.0'
//classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21"
classpath "org.jetbrains.kotlin:kotlin-stdlib:1.3.21"
//classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
以删除这些注释。
gtid代表全局事务ID,是RDBS的强大功能。如果您的数据库具有全局事务,请考虑使用此解决方案。