我有一个在 PHP 5.6 和 Laravel 5.2 上运行的应用程序。它托管在 AWS 中的 AWS Linux 1 EC2 计算机上。此 Web 服务器连接到 RDS MySQL 实例。 RDS 实例已运行 MySQL 5.7 多年。
MySQL 5.7 已于 2023 年底结束生命周期,亚马逊正在逐步取消 RDS 中对 MySQL 5 的标准支持。我本周已按照本指南中规定的预防措施将我的 RDS 实例更新到 MYSQ 8.0。
以下是我所做的事情:
-在我的 Laravel
config/database.php
文件中,我有以下内容:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
-在 RDS 中,我附加了一个具有以下覆盖的参数组:
将上述数据库配置值保存到参数组中后,我确保允许我的 RDS MySQL 实例完成“修改”,然后通过 AWS 控制台重新启动该实例。
-我还确保从 Laravel 应用程序连接的 MySQL 用户具有身份验证插件 mysql_native_password (而不是新插件 caching_sha2_password)。
-我已经测试过,我可以使用通过 MySQL Workbench 向 Laravel 应用程序提供的用户名/密码连接到 RDS MySQL 实例
执行上述步骤后,我收到以下错误:
除了上述配置(与所有 MySQL 5 到 8 升级指南以及我在互联网上看到的所有问题和答案一致)之外,我还尝试过:
-将 RDS 参数组中的所有
character_set_*
值设置为 utf8mb4
(MySQL 8 中的默认字符集),并将参数组中的 collation_*
值设置为 utf8mb4_0900_ai_ci
(MySQL 8 中的默认排序规则)。
-将我的 Laravel 数据库配置设置为:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_0900_ai_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
],
以匹配新的 MySQL 8 字符集和排序规则默认值。
-在每次可能的迭代中混合并匹配上述配置
我无法克服上面发布的
SQLSTATE[HY000] [2002]
错误。
是否有人使用旧版本的 Laravel(最好将 MySQL 实例托管在 RDS 上)经历过相同的 MySQL 5 到 8 升级过程,并且必须解决相同的错误?
可能是 TLS 问题,有关 RDS 如何为实例配置 TLS 证书的一些详细信息此处。您可能需要向应用程序提供数据库 ssl 配置并将 RDS CA 证书添加到服务器。下载 ca 证书的说明可以在此处找到。
下面是一个示例配置,其中 RDS CA 证书位于
database/certs/rds-combined-ca-bundle.pem
;
'mysql_ssl' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
'sslmode' => 'verify_identity',
'options' => [
PDO::MYSQL_ATTR_SSL_CA => base_path('database/certs/rds-combined-ca-bundle.pem')
],
],