1. 为什么需要从MySQL迁移到PostgreSQL最近接手了一个老项目的重构任务原本基于RuoYi-Vue框架的系统一直使用MySQL数据库。但在客户要求下需要将整个系统迁移到PostgreSQL。说实话刚开始我也觉得不就是换个数据库嘛改改连接配置不就行了结果实际操作起来才发现这里面的坑还真不少。PostgreSQL作为一款开源关系型数据库在很多方面确实比MySQL更有优势。比如它支持更丰富的数据类型包括JSON、数组等事务处理更完善还有强大的扩展能力。特别是在处理复杂查询和大数据量时PostgreSQL的表现往往更出色。不过这些优势也带来了迁移时的适配成本毕竟两种数据库在语法和特性上还是有不少差异的。2. 迁移前的准备工作2.1 环境检查与依赖调整首先得确保开发环境已经安装了PostgreSQL。我推荐使用Docker来快速搭建环境docker run --name some-postgres -e POSTGRES_PASSWORDmysecretpassword -d -p 5432:5432 postgres接下来要在项目中添加PostgreSQL的JDBC驱动依赖。在pom.xml中添加!-- postgresql -- dependency groupIdorg.postgresql/groupId artifactIdpostgresql/artifactId version42.5.4/version /dependency这里我建议使用较新的版本因为老版本可能会有一些兼容性问题。记得把原来的MySQL驱动注释掉或者移除。2.2 数据库连接配置修改RuoYi-Vue使用的是Druid连接池我们需要修改application-druid.yml文件spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/your_database?currentSchemapublicuseUnicodetruecharacterEncodingutf8 username: postgres password: your_password这里有几个关键点需要注意currentSchema参数指定了默认的schemaPostgreSQL中这个概念相当于MySQL的databasePostgreSQL默认的端口是5432字符集设置和MySQL有些不同3. 核心组件的适配改造3.1 Quartz调度器配置RuoYi-Vue内置了Quartz任务调度功能需要针对PostgreSQL进行特殊配置。在ScheduleConfig类中找到schedulerFactoryBean方法添加以下配置prop.put(org.quartz.jobStore.driverDelegateClass, org.quartz.impl.jdbcjobstore.PostgreSQLDelegate);这个配置告诉Quartz使用PostgreSQL专用的SQL语句来处理任务调度避免出现语法不兼容的问题。3.2 分页插件调整RuoYi-Vue默认使用的是PageHelper分页插件需要在配置文件中修改方言设置pagehelper: helper-dialect: postgresql reasonable: true support-methods-arguments: true如果不做这个修改分页查询可能会报错因为MySQL和PostgreSQL的分页语法是不同的LIMIT vs OFFSET。4. SQL语句的适配改造4.1 函数替换MySQL和PostgreSQL有很多函数是不同的需要进行全局替换sysdate()→now()ifnull()→coalesce()date_format()→to_char()这些替换可以通过IDE的全局替换功能批量完成但建议替换后仔细检查确保没有误替换。4.2 类型处理PostgreSQL对类型要求更严格特别是在比较操作时数字和字符串的比较需要显式转换-- MySQL status 0 -- PostgreSQL status 0数组处理也不同-- MySQL的find_in_set find_in_set(#{deptId}, ancestors) -- PostgreSQL等价写法 cast(#{deptId} as varchar) any(string_to_array(ancestors,,))4.3 其他常见差异自增主键PostgreSQL使用SERIAL或IDENTITY而不是AUTO_INCREMENT引号PostgreSQL只支持单引号表示字符串空值判断PostgreSQL中空字符串和NULL是不同的5. 迁移后的测试要点完成代码修改后必须进行全面测试。我建议重点关注以下几个方面基础CRUD操作确保增删改查基本功能正常事务处理特别是跨多个表的操作复杂查询包含子查询、连接、分组等分页功能各种条件下的分页是否正确定时任务Quartz调度是否正常执行性能测试大数据量下的查询效率6. 常见问题与解决方案在实际迁移过程中我遇到了不少问题这里分享几个典型的序列问题PostgreSQL使用序列来实现自增如果直接从MySQL导入数据可能需要重置序列SELECT setval(your_table_id_seq, (SELECT MAX(id) FROM your_table));时区问题PostgreSQL的时区处理与MySQL不同建议在连接字符串中明确指定url: jdbc:postgresql://localhost:5432/your_database?currentSchemapublicuseUnicodetruecharacterEncodingutf8TimeZoneAsia/Shanghai大小写敏感PostgreSQL默认是大小写敏感的如果表名或列名有大写字母查询时需要加双引号SELECT * FROM UserTable WHERE UserName test;7. 数据迁移工具推荐如果现有MySQL数据库中有大量数据需要迁移可以使用以下工具pgloader一个强大的数据迁移工具支持从MySQL到PostgreSQL的迁移pgloader mysql://user:passwordlocalhost/source_db postgresql://user:passwordlocalhost/target_dbDBeaver数据库管理工具提供数据导出/导入功能自定义脚本对于特殊需求可以编写Python或Shell脚本来处理8. 性能优化建议迁移完成后可以考虑针对PostgreSQL进行一些性能优化索引优化PostgreSQL的索引类型比MySQL丰富可以根据查询模式选择合适的索引分区表对于大表可以考虑使用PostgreSQL的分区表功能连接池配置根据实际负载调整Druid连接池参数查询计划分析使用EXPLAIN ANALYZE分析慢查询整个迁移过程虽然有些繁琐但完成后系统的稳定性和性能确实有了明显提升。特别是在处理复杂查询和大数据量时PostgreSQL的表现确实令人满意。