Showing 3 out of total 134
dji drone enterprice wholesale
yii3 mysql 8 转 postgresql 18
1.安装官方源
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 禁用系统默认PostgreSQL模块(避免冲突)
sudo dnf -qy module disable postgresql
2.安装postgresql18
sudo dnf install -y postgresql18-server postgresql18
# 初始化数据库
sudo /usr/pgsql-18/bin/postgresql-18-setup initdb
# 启动并设置开机自启
sudo systemctl enable --now postgresql-18
修改默认数据存储位置
# 编辑PG 18的主配置文件 sudo vi /var/lib/pgsql/18/data/postgresql.conf
# 找到 data_directory 行,修改为新路径 data_directory = '/data/postgres/18' # 注意:路径要用单引号,且末尾无斜杠
# 复制默认服务文件到自定义目录(避免系统更新覆盖)
sudo cp /usr/lib/systemd/system/postgresql-18.service /etc/systemd/system/
# 编辑自定义服务文件
sudo vi /etc/systemd/system/postgresql-18.service
# 找到 [Service] 段,添加/修改 Environment 行(指定新数据目录)
[Service] Environment=PGDATA=/data/postgres/18
# 刷新systemd配置 sudo systemctl daemon-reload
# 启动PG 18服务 sudo systemctl start postgresql-18
# 确认服务正常运行 sudo systemctl status postgresql-18
2.使用pgloader把mysql数据库转成postgres
dnf install -y pgloader
建立postgres数据库,用户,授权
进入postgres命令行
sudo -u postgres psql
新建数据库,用户,并授权,这里把数据库全部权限给了
CREATE DATABASE db_psql;
CREATE USER db_user WITH PASSWORD 'your password';
GRANT ALL PRIVILEGES ON DATABASE db_psql TO db_user;
编写转换脚本
vi migration.load
LOAD DATABASE
FROM mysql://mysql_user:password@172.232.188.233/mysqldb
INTO postgresql://postgres_user:password@127.0.0.1/db_psql
WITH include drop, create tables,
reset sequences,
quote identifiers,
workers = 8, concurrency = 1,
multiple readers per thread, rows per range = 50000
SET PostgreSQL PARAMETERS
maintenance_work_mem to '128MB',
work_mem to '12MB'
SET MySQL PARAMETERS
net_read_timeout = '120',
net_write_timeout = '120'
CAST
type date drop default drop not null using zero-dates-to-null,
type year to integer;
具体参数参考 https://pgloader.readthedocs.io/en/latest/ref/mysql.html
AI可能会给你一些过时的参数,自己参考一下
执行转换:
pgloader migration.load
顺利的话可能就可以转换过去,每个库的情况可能不太一样
对于yii3建议保留数据库大小写 ,加上 quote identifiers这个参数,因为yii3 cycle数据库同步会把字段大小写是区分的(不知道怎么设置成都转换小写)
3.升级yii程序
composer require yiisoft/db-pgsql
可以移除db-mysql
composer remove yiisoft/db-mysql
config/common/di/db-mysql.php 可以重命名或者删除
添加 db-pgsql.php
<?php
declare(strict_types=1);
use Yiisoft\Db\Connection\ConnectionInterface;
use Yiisoft\Db\Pgsql\Connection;
use Yiisoft\Db\Pgsql\Driver;
/** @var array $params */
return [
ConnectionInterface::class => [
'class' => Connection::class,
'__construct()' => [
'driver' => new Driver(
$params['yiisoft/db-pgsql']['dsn'],
$params['yiisoft/db-pgsql']['username'],
$params['yiisoft/db-pgsql']['password'],
),
],
],
];
然后修改
config/common/params.php
关于mysql的配置
// 'yiisoft/db-mysql' => [
// 'dsn' => (new Dsn('mysql', '127.0.0.1', 'youdb', '3306', ['charset' => 'utf8mb4']))->__toString(),
// 'username' => 'dbuser',
// 'password' => 'dbpassword',
// ],
'yiisoft/db-pgsql' => [
'dsn' => new Dsn('pgsql', '127.0.0.1', 'your_psql', '5432'),
'username' => 'pg_user',
'password' => 'pg_password',
],
如果你使用了cycle
// 'databases' => [
// 'default' => ['connection' => 'mysql', 'prefix' => 'mt_'],
// ],
// 'connections' => [
// 'mysql' => new \Cycle\Database\Config\MySQLDriverConfig(
// connection: new \Cycle\Database\Config\MySQL\TcpConnectionConfig(
// database: 'mysqldb',
// host: '127.0.0.1',
// port: 3306,
// user: 'mysql_user',
// password: 'mysql_password',
// charset: 'utf8mb4',
// ),
// queryCache: true,
// timezone: 'Asia/Shanghai'
// ),
// ],
'databases' => [ 'default' => ['connection' => 'postgres', 'prefix' => 'mt_'], ], 'connections' => [ 'postgres' => new \Cycle\Database\Config\PostgresDriverConfig( connection: new \Cycle\Database\Config\Postgres\TcpConnectionConfig( database: 'your_psql_db', host: '127.0.0.1', port: 5432, user: 'pgsl_user', password: 'pgsl_password', ), schema: 'pgsl_shema(这个可以是原来mysql数据库名)', queryCache: true, timezone: 'Asia/Shanghai' ), ],
更改配置文件,然后吧数据库同步打开执行一次,会检查数据错误,如果有数据不一致等情况会执行很慢,根据错误修改,(不要忘记生产环境要把这个关掉)
FromConveyorSchemaProvider::class => [ 'generators' => [ Cycle\Schema\Generator\SyncTables::class, // sync table changes to database ], ],


