我想将 MySQL 从版本 5.0(我有 5.0.86)升级到 5.5(比如说 5.5.17)
经过一番搜索,我发现了这个方法:
- 在 backup_data.sql 中转储数据库但不转储 mysql 数据库
- 这是最重要的一步:使用选项转储 mysql 数据库
--complete-insert
并将--no-create-info
其保存在文件中(假设为 mysql.sql):其想法是获取一个 sql 数据库,类似于从头开始设置 5.5 版本然后创建用户。 - 卸载 5.0 - 安装 5.5
- 恢复 mysql 数据库并刷新权限以恢复它。
- 恢复其他数据库。
我的问题发生在步骤4:当我这样做时:
mysql -u root mysql < mysql.sql
我收到关于主键重复条目的错误。当我转储没有选项--complete-insert
和的mysql 数据库时--no-create-info
,恢复工作正常,但我得到的 sql 数据库与使用新的 5.5 设置创建的数据库不同,这不是我想要的。
对这个问题有什么想法或建议吗?
答案1
您不能 mysqldump mysql 模式并简单地导入到更高版本。为什么?在 DBA StackExchange 中,我在一年多前回答了这个问题:无法以 root 身份授予权限简而言之,该表mysql.user
对于 MySQL 的每个主要版本都有不同的列数:
- MySQL 5.6 中有 43 列
- MySQL 5.5 中有 42 列
- MySQL 5.1 中有 39 列
- MySQL 5.0 中有 37 列
- MySQL 4.x 中有 31 列
- 请参阅我的回答以查看专栏
您可以mysql.user
使用以下两种技术之一进行转储:
方法 #1
使用以下 Percona 工具之一
将任一程序的输出回显到文本文件。
技巧 #2
你可以模仿pt-show-赠款如下:
cd
MYSQL_CONN="-uroot -ppassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ',"
SQLSTMT="${SQLSTMT} QUOTE(user),'@',QUOTE(host),';') "
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > GetGrants.sql
echo "SET sql_log_bin = 0;" > MySQLUserGrants.sql
mysql ${MYSQL_CONN} -AN < GetGrants.sql | sed 's/$/;/g' >> MySQLUserGrants.sql
rm -f GetGrants.sql
这是将授权从一个版本迁移到另一个版本的最干净、最安全的方法。我已多次成功将 MySQL 5.0 升级到 MySQL 5.1/5.5。您无法将 MySQL 5.0 升级到 MySQL 5.6,因为在我看来,16 个字符的密码()函数 hash 无法通过 old_password 获得。如果您拥有所有用户的纯文本密码,只需编辑 MySQLUserGrants.sql 并将其替换IDENTIFIED BY PASSWORD '16-char hash'
为IDENTIFIED BY 'plaintext password'
。然后您可以在 MySQL 5.6 中执行它。完成后,快速删除 MySQLUserGrants.sql。
答案2
备份 mysql.* 数据库。使用标志重新导出 mysql 数据库--replace
并重新导入。如果没有达到预期效果,查看此帖子中有关转储补助金的脚本。