MySql表结构迁移到PostgreSql(pgsql) 方案

本文介绍了一位开发者如何使用Java代码手动迁移MySQL数据库表结构到PostgreSQL,包括获取表结构、类型转换和生成迁移脚本,由于商业限制未使用付费工具而选择自定义解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于工作需要,要将原有的mysql的表结构和数据都迁移到pgsql里面,因为pgsql支持更大数据存储,还能做AI大模型的向量数据库。
网上找了很多种办法,这种跨数据库的迁移方案都是收费的。只有navicate 工具可以免费迁移,怎耐我们公司禁止使用navicate 。

没有办法,我只能首先java代码实现数据库表结构迁移工作。

下面就是代码,本打算从mysql读取所有的数据库结构直接插入到pgsql里面,但是实际却发现有很多不合理的地方,与改成了将所有的mysql结构生成pgsql 的结构打印出来。使用者可以拷贝打印出来的内容形成一个脚本再使用。

里面有类型转换我中用到我们实际使用到的结果,还有不少没列出来,使用时要注意一下。

import java.sql.*;
import java.util.*;

public class MysqlToPgsqlMigration {
    private static final String MYSQL_URL = "jdbc:mysql://127.0.0.1:3306/test";
    private static final String MYSQL_USER = "root";
    private static final String MYSQL_PASSWORD = "root";

    private static final String POSTGRESQL_URL = "jdbc:postgresql://127.0.0.1:5432/jeecg-boot";
    private static final String POSTGRESQL_USER = "root";
    private static final String POSTGRESQL_PASSWORD = "root1";

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Class.forName("org.postgresql.Driver");

        try (Connection mysqlConn = DriverManager.getConnection(MYSQL_URL, MYSQL_USER, MYSQL_PASSWORD);
             Connection pgsqlConn = DriverManager.getConnection(POSTGRESQL_URL, POSTGRESQL_USER, POSTGRESQL_PASSWORD)) {

            DatabaseMetaData mysqlMeta = mysqlConn.getMetaData();
            Statement pgsqlStmt = pgsqlConn.createStatement();

            ResultSet tablesRs = mysqlMeta.getTables(null, null, "%", new String[]{"TABLE"});

            while (tablesRs.next()) {
                String tableName = tablesRs.getString("TABLE_NAME");
                // 重建表结构
                StringBuilder createTableSql = new StringBuilder("CREATE TABLE ");
                createTableSql.append(tableName).append(" (\n");

                ResultSet columnsRs = mysqlMeta.getColumns(null, null, tableName, null);
                List<String> primaryKeyColumns = new ArrayList<>();
                List<String> indexKeyColumns = new ArrayList<>();
                List<String> columnComments = new ArrayList<>();
                List<String>  uniqueindexKeyColumns = new ArrayList<>();
                while (columnsRs.next()) {
                    String columnName = columnsRs.getString("COLUMN_NAME");
                    int dataType = columnsRs.getInt("DATA_TYPE");
                    String typeName = mapColumnType(dataType);
                    int size = columnsRs.getInt("COLUMN_SIZE");
                    
### 将 MySQL 数据库迁移PostgreSQL 的方法 #### 方法一:使用第三方工具 一种高效的方式是利用专门设计用于数据库迁移的第三方工具。例如,`pgloader` 是一款功能强大的开源工具,支持从 MySQLPostgreSQL 的无缝迁移[^2]。以下是 `pgloader` 的基本用法: ```bash pgloader mysql://username:password@localhost/source_db postgresql://username:password@localhost/target_db ``` 此命令会自动处理 SQL 语法转换、数据类型映射以及索引重建等问题。 另一种工具是 `py-mysql2pgsql`,它是一个基于 Python 的脚本,允许用户手动调整迁移过程中的细节[^2]。安装并运行该工具可以通过以下方式完成: ```bash pip install pymysql2pgsql pymysql2pgsql --mysql-host=localhost --mysql-db=source_db --postgres-db=target_db ``` #### 方法二:导出和导入 如果不想依赖外部工具,也可以通过手动导出和导入的方式来实现迁移。具体步骤如下: 1. **导出 MySQL 数据** 使用 `mysqldump` 命令将 MySQL 表结构和数据导出为一个 SQL 文件。为了兼容 PostgreSQL,建议指定 `--compatible=postgresql` 参数[^2]。 ```bash mysqldump --compatible=postgresql --no-tablespaces -u username -p source_db > dump.sql ``` 2. **修改 SQL 文件** 导出后的 SQL 文件可能仍然存在不兼容的地方,因此需要对其进行编辑。常见的更改包括替换特定的数据类型(如 `TINYINT(1)` 替换为 `BOOLEAN`),移除 MySQL 特定的关键字等[^1]。 3. **导入到 PostgreSQL** 修改完成后,可以使用 `psql` 工具将 SQL 文件加载到目标 PostgreSQL 数据库中。 ```bash psql -U username -d target_db -f dump.sql ``` #### 方法三:创建对应数据库 在执行任何迁移之前,需确保已在 PostgreSQL 中创建了一个与源 MySQL 数据库对应的空白数据库。这一步骤可通过命令行或图形化界面工具(如 pgAdmin)轻松完成[^3]。 ```bash createdb mydb ``` 以上三种方法各有优劣,选择适合项目需求的具体方案即可顺利完成迁移工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值