mysql迁移到翰高数据库

一,设置翰高数据库可以远程访问

检查数据库服务状态
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迁移到翰高数据库

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.权限配置:重新配置应用程序用户的权限。

相关推荐
韩立学长38 分钟前
【开题答辩实录分享】以《智慧物业管理系统的设计与实现》为例进行答辩实录分享
java·后端·mysql
p***323540 分钟前
一条sql 在MySQL中是如何执行的
数据库·sql·mysql
yeshihouhou1 小时前
redis 单机安装(linux)
数据库·redis·缓存
fruge1 小时前
MateChat + DevUI + DeepSeek:教育智能答疑助手改造实践
数据库
LeeZhao@2 小时前
【狂飙全模态】狂飙AGI-智能答疑助手
数据库·人工智能·redis·语言模型·aigc·agi
('-')2 小时前
《从根上理解MySQL是怎样运行的》第二十章笔记
数据库·笔记·mysql
z***02602 小时前
SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)
spring boot·mysql·sqlserver
tanxiaomi2 小时前
Redisson分布式锁 和 乐观锁的使用场景
java·分布式·mysql·面试