侧边栏壁纸
博主头像
MDZZW博主等级

曾经也是帅哥,如今只是肉多

  • 累计撰写 28 篇文章
  • 累计创建 26 个标签
  • 累计收到 7 条评论

Mysql迁移MogDB

MDZZW
2022-11-16 / 0 评论 / 1 点赞 / 866 阅读 / 1,788 字
温馨提示:
本文最后更新于 2023-12-12,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

MogDB介绍

MogDB 是云和恩墨以华为 openGauss 开源数据库为基础,围绕高可用、安全、自动化运维、数据库一体机、SQL审核优化等企业需求推出的整体解决方案

MySQL和MogDB 注意事项

  1. 数据库兼容模式
    create database test DBCOMPATIBILITY=‘B’
    A、 B 、 PG 分别对应 Oracle、Mysql、PostgreSQL

  2. Timestamp 关键字
    MySQL8之前版本explicit_defaults_for_timestamp默认值为OFF,timestamp列会指定默认值
    MogDB 不会做非标处理。 如果字段有非空校验,insert里面必须有值

  3. 事务回滚
    MySQL客户端开启会话开启事务,中途sql报错还是需要手工 提交或者回滚
    MogDB开启会话事务,中途sql报错哪怕提交了也会自动回滚

  4. 内置函数
    MogDB不支持MySQL的某些函数如:uuid()、 IFNULL() 、 等可以通过MySQL和Oracle兼容性脚本安装
    下载地址: MySQL和Oracle兼容函数脚本

  5. 语法差异

    • group by 必须配合聚合函数使用,select 字段名除使用聚合函数的都必须写在group by 里

    • 多表关联更新和删除语法变更

      Mysql MogDB
      update update course a,user b
      set a.name= ‘MySQL语法’
      where b.code= a.code
      AND b.name= ‘张三’
      update course a
      set a.name= ‘MySQL语法’
      from user b
      where b.code= a.code
      AND b.name= ‘张三’
      delete DELETE
      a.*
      FROM
      course a,user b
      WHERE
      b.code= a.code
      AND b.name= ‘张三’
      WITH b as (SELECT * from user WHERE name= ‘张三’)

      DELETE
      ONLY course a
      WHERE a.code in(SELECT code from b)
    • group_concat 函数不存在 兼容性函数也没有

      listagg 代替 再用 regexp_substr 正则匹配字符串 可以达到一个效果

    • MogDB 表字段名只能小写

      有的客户端工具可以手工将字段改成大写但是会导致sql出现莫名其妙的异常

    • update 出现错误cache lookup failed for function 0 SQL检查后确认无问题这是一个bug需要升级数据库

    • MOGDB delete 不能加入* 或字段 Mysql可以

    • MySQL用子查询删除和更新会有性能问题, MogDB支持子查询删除和更新

    • MogDB select 里面的别名 不能使用单引号 ‘’ where 里面的字符条件不能使用 双引号包含

    • MogDB 存在sql 1M上限 参数个数限制不能超过32767 个 , MySQL可以调整缓冲区解决。

    • 目前教程只有墨天伦和官方文档资源较少

    • 强烈建议使用官方客户端连接工具 可能会有兼容性问题

      Mogeaver下载地址

  6. 开发篇

    Struts项目连接MogDB 改造

    pom依赖

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.3.3</version>
    </dependency>
    

    连接池配置这里用的是 Ibatis POOLED 连接池

    image-20221116172605589

    mysql.driver=org.postgresql.Driver
    mysql.url=jdbc:postgresql://IP:端口/数据库?currentSchema=当前模式
    mysql.username=用户名
    mysql.password=密码
    #在任意时间可以存在的活动(也就是正在使用)连接数量,默认值:10
    mysql.poolMaximumActiveConnections=100
    #任意时间可能存在的空闲连接数 默认是5,最好设置为0,否则可能会崩溃掉
    mysql.poolMaximumIdleConnections=0
    #在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)
    mysql.poolMaximumCheckoutTime=20000
    #这是一个底层设置,如果获取连接花费的相当长的时间,它会给连接池打印状态日志并重新尝试获取一个连接(避免在误配置的情况下一直安静的失败),默认值:20000 毫秒(即 20 秒)。
    mysql.poolTimeToWait=20000
    # 是否启用侦测查询。若开启,也必须使用一个可执行的 SQL 语句设置 poolPingQuery 属性(最好是一个非常快的 SQL),默认值:false。
    mysql.poolPingEnabled=true
    #配置 poolPingQuery 的使用频度。这可以被设置成匹配具体的数据库连接超时时间,来避免不必要的侦测,默认值:0(即所有连接每一时刻都被侦测 当然仅当 poolPingEnabled 为 true 时适用)
    mysql.poolPingConnectionsNotUsedFor=60000
    #发送到数据库的侦测查询,用来检验连接是否处在正常工作秩序中并准备接受请求。默认是“NO PING QUERY SET”,这会导致多数数据库驱动失败时带有一个恰当的错误消息。
    mysql.poolPingQuery=select 1
    
    SpringBoot项目连接MogDB 改造

    pom依赖

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.3.3</version>
    </dependency>
    

    连接池配置这里用的是 阿里巴巴数据库连接池

    spring:
      datasource:
        name: druidDataSource
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.postgresql.Driver
        #你自己的数据库IP地址和数据库名,账号以及密码
        url: jdbc:postgresql://IP:端口/数据库?currentSchema=当前模式
        username: 用户名
        password: 密码
        druid:
          #监控统计拦截的过滤器 不加监控界面sql无法统计 wall用于防火墙
          filters: stat,wall,slf4j,config
          #最大连接数
          max-active: 100
          #初始化大小
          initial-size: 5
          #获取连接最大等待时间
          max-wait: 60000
          min-idle: 5
          #间隔多久检测一次需要关闭的空闲连接 毫秒
          time-between-eviction-runs-millis: 60000
          #连接在连接池中最小生存的时间,毫秒
          min-evictable-idle-time-millis: 300000
          validation-query: select 'x'
          test-while-idle: true
          test-on-borrow: false
          test-on-return: false
          pool-prepared-statements: true
          max-open-prepared-statements: 50
          max-pool-prepared-statement-per-connection-size: 20
          connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
          web-stat-filter:
            exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
            url-pattern: /*
          stat-view-servlet:
            #白名单IP
            allow:
            #黑名单IP
            deny:
            #登录账号和密码
            login-username: test
            login-password: test
            #启用重置数据功能
            reset-enable: false
    
    存储过程

    ​ 创建一个返回结果集的存储过程

    CREATE OR REPLACE FUNCTION blog.getAllUserByName(name character varying)
     RETURNS TABLE(id character varying, code character varying, money numeric)
     LANGUAGE plpgsql
     NOT FENCED NOT SHIPPABLE
    AS $function$
    begin
    return query select * from user where name=name;
    end;
    $function$;
    

    MyBatis Mapper.xml 写法

    <select id="getAllUserByName" resultType="用户实体" statementType="CALLABLE">
       {call getAllUserByName(#{name,mode=IN})}
    </select>
    

    ​ 其他存储过程参考

    https://www.modb.pro/db/400634

  7. 运维篇

    建议使用官方推荐客户端连接工具

image-20221116174822721

可以窗口化完成日常工作并且也可以查询窗口操作的示例代码

#创建用户 
CREATE ROLE 用户名 IDENTIFIED BY '密码';

#授权用户模式
GRANT USAGE ON SCHEMA 模式名 TO 用户名;

#追加用户权限   注意: 当面命令只能追加不能覆盖

GRANT select ,update(字段,字段,字段)  ON table 模式名.表名 TO 用户名;

#撤销对该权限授权的权力,而不撤销该权限本身

REVOKE GRANT OPTION FOR UPDATE ON table 模式名.表名FROM  用户名

#撤销用户更新权限

REVOKE  UPDATE ON table reins.fdconfig FROM  用户名 

MDZZW也是刚学2周就完成了数据库切换其他内容边学边补充,也欢迎大神指导

1

评论区