一,设置翰高数据库可以远程访问
检查数据库服务状态
bash
# 检查数据库服务是否运行
sudo systemctl status highgo
# 如果没有运行,启动服务
sudo systemctl start highgo
# 检查进程
ps aux | grep postgres
检查本地连接
bash
# 先在数据库服务器本地测试连接
psql -h localhost -p 5866 -d highgo -U jing -c "SELECT version();"
配置远程访问
bash
vi /home/jing/hgdb-v9.0/data/postgresql.conf
找到并修改
bash
listen_addresses = '*' # 允许所有IP连接
port = 5866
修改客户端认证
bash
# 允许从任何IP连接
host all all 0.0.0.0/0 scram-sha-256
重启数据库服务器
bash
# 重启服务
sudo systemctl restart highgo
检查端口监听
bash
# 检查5866端口是否在监听
netstat -tulpn | grep 5866
# 应该看到类似:
# tcp 0 0 0.0.0.0:5866 0.0.0.0:* LISTEN 12345/postgres
配置防火墙
bash
# 开放5866端口
sudo ufw allow 5866
# 或者针对特定IP开放
sudo ufw allow from 192.168.190.154 to any port 5866
# 检查防火墙状态
sudo ufw status
备注,如果检查端口监听时,出现
tcp 0 127.0.0.1:5866 0.0.0.0:* LISTEN 12345/postgres
这会只能本地连接,不能远程连接。
需要再排查下原因,这是我遇到的问题,解决方案
用root权限检查端口监听
bash
# 用sudo检查端口监听(显示完整信息)
sudo netstat -tulpn | grep 5866
# 或者使用ss命令
sudo ss -tulpn | grep 5866
检查数据库日志
bash
# 查看数据库启动日志
sudo journalctl -u highgo -n 20
# 或者查看数据库日志文件
sudo tail -f /home/jing/hgdb-v9.0/data/log/*.log
检查是否有其他配置覆盖
bash
# 检查所有配置文件中关于listen的设置
sudo grep -r "listen" /home/jing/hgdb-v9.0/data/
# 检查是否有环境变量覆盖
sudo grep -r "PGPORT\|PGHOST" /etc/systemd/system/
通过以上找到问题
有两个配置文件在冲突:
/home/jing/hgdb-v9.0/data/postgresql.conf - 设置了 listen_addresses = '*'
/home/jing/hgdb-v9.0/data/db.conf - 设置了 listen_addresses = 'localhost'
db.conf 文件覆盖了 postgresql.conf 的设置!
解决方案
bash
# 编辑 db.conf 文件
sudo vi /home/jing/hgdb-v9.0/data/db.conf
找到并修改:
bash
# 将
listen_addresses = 'localhost'
# 改为
listen_addresses = '*'
重启数据库服务
bash
# 重启服务
sudo systemctl restart highgo
# 检查状态
sudo systemctl status highgo
# 检查端口监听
sudo netstat -tulpn | grep 5866
应该能看到
bash
tcp 0 0 0.0.0.0:5866 0.0.0.0:* LISTEN xxxxx/postgres
二,进行迁移,这里选择从mysql迁移到翰高数据库
方法1,使用 Navicat Premium
Navicat Premium 支持多种数据库,包括 MySQL 和 PostgreSQL(与翰高数据库兼容),可以方便地进行数据传输。
步骤
1,准备环境:确保你安装了 Navicat Premium,并且可以同时连接到源 MySQL 数据库和目标翰高数据库。
2,创建目标空数据库:在翰高数据库中创建一个空的数据库,用于接收数据。
3,使用"数据传输"功能:
- 在 Navicat 中,选择 工具 -> 数据传输。
- 源:选择你的 MySQL 连接和数据库。
- 目标:选择你的翰高数据库连接和刚创建的空数据库。
4,配置传输选项:
- "高级"选项卡:这是关键。
勾选 "遇到错误时继续",避免因单条记录失败而中断整个进程。
在 "记录转换" 或类似选项中,可以选择在传输时执行一些简单的数据转换。
- "选项"选项卡:可以选择传输表结构、数据、索引、约束等。建议第一次先只传输 "结构",检查和修复问题后,再单独传输 "数据"。
5,运行并检查:
- 开始传输。Navicat 会自动尝试创建兼容的表结构并插入数据。
- 传输完成后,务必仔细检查日志文件,查看是否有表创建失败、数据类型转换错误或数据插入失败等情况。
6,手动修复:根据日志中的错误,手动在翰高数据库中修复不兼容的 SQL 语句或数据类型。

方法二:使用 SQL 文件导出和导入 (通用方法)
这是一种比较原始但可控的方法,适用于数据量不大或需要深度定制的情况。
步骤:
1,从 MySQL 导出结构和数据
-
使用 mysqldump 工具,但最好将表结构和数据分开导出,以便于修改。
-
导出仅结构:
bash
mysqldump -h [mysql_host] -u [user] -p --no-data [database_name] > mysql_schema.sql
导出仅数据:
bash
mysqldump -h [mysql_host] -u [user] -p --no-create-info [database_name] > mysql_data.sql
2,转换 SQL 文件
这是最繁琐但最关键的一步。你需要手动或使用脚本修改 mysql_schema.sql 文件,使其符合翰高数据库(PostgreSQL)的语法。
常见转换项:
-
反引号:MySQL 使用 `,PostgreSQL 使用 " 或不使用(如果表名/字段名不是关键字)。
-
自增主键:
MySQL: id int AUTO_INCREMENT PRIMARY KEY
PostgreSQL: id SERIAL PRIMARY KEY 或 id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY
- 字符串类型:
LONGTEXT -> TEXT
TINYTEXT -> TEXT 或 VARCHAR
VARCHAR(255) -> VARCHAR(255) (通常不变)
- 日期时间类型:
DATETIME -> TIMESTAMP
TIMESTAMP -> TIMESTAMPTZ (建议,带时区)
- 布尔类型:
TINYINT(1) -> BOOLEAN
- 注释语法:
MySQL: COMMENT 这是一个注释
PostgreSQL: COMMENT ON COLUMN table_name.column_name IS '这是一个注释';
-
索引:检查是否有特定于 MySQL 的索引类型(如 FULLTEXT),需要在翰高中找到替代方案(如 GIN 索引)。
-
引擎声明:删除 ENGINE=InnoDB 等。
3,在翰高数据库中导入
-
使用 psql 命令行工具连接到翰高数据库。
-
先导入修改后的结构文件:
bash
psql -h [highgo_host] -U [highgo_user] -d [highgo_database] -f converted_schema.sql
- 然后导入数据文件:
bash
psql -h [highgo_host] -U [highgo_user] -d [highgo_database] -f mysql_data.sql
4,修复序列(自增)
数据导入后,表的自增序列可能没有更新到最大值,需要手动重置。
bash
sql
-- 为每个有自增主键的表执行以下操作(以表 your_table 和主键列 id 为例)
SELECT setval(pg_get_serial_sequence('your_table', 'id'), COALESCE(MAX(id), 1)) FROM your_table;
-- 或者使用一个脚本生成所有表的修复语句
SELECT 'SELECT setval(pg_get_serial_sequence(''' || table_name || ''', ''' || column_name || '''), COALESCE(MAX(' || column_name || '), 1)) FROM ' || table_name || ';'
FROM information_schema.columns
WHERE table_schema = 'public'
AND column_default LIKE 'nextval%';
三,迁移后的关键检查和验证
无论使用哪种方法,迁移完成后都必须进行验证:
1.数据一致性检查:随机抽取几张表,对比 MySQL 和翰高数据库中的记录数量以及关键字段的值是否一致。
2.应用程序测试:将应用程序的连接字符串指向新的翰高数据库,进行全面的功能测试、性能测试和压力测试。
3.检查存储过程和函数:如果 MySQL 中有存储过程、函数或触发器,它们几乎 100% 需要重写,因为两者的语法完全不同。这部分通常是手动工作量最大的。
4.检查外键和约束:确保所有外键约束、唯一约束等都正确迁移。
5.权限配置:重新配置应用程序用户的权限。