MogDB介绍
MogDB 是云和恩墨以华为 openGauss 开源数据库为基础,围绕高可用、安全、自动化运维、数据库一体机、SQL审核优化等企业需求推出的整体解决方案
MySQL和MogDB 注意事项
-
数据库兼容模式
create database test DBCOMPATIBILITY=‘B’
A、 B 、 PG 分别对应 Oracle、Mysql、PostgreSQL -
Timestamp 关键字
MySQL8之前版本explicit_defaults_for_timestamp默认值为OFF,timestamp列会指定默认值
MogDB 不会做非标处理。 如果字段有非空校验,insert里面必须有值 -
事务回滚
MySQL客户端开启会话开启事务,中途sql报错还是需要手工 提交或者回滚
MogDB开启会话事务,中途sql报错哪怕提交了也会自动回滚 -
内置函数
MogDB不支持MySQL的某些函数如:uuid()、 IFNULL() 、 等可以通过MySQL和Oracle兼容性脚本安装
下载地址: MySQL和Oracle兼容函数脚本 -
语法差异
-
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可以调整缓冲区解决。
-
目前教程只有墨天伦和官方文档资源较少
-
强烈建议使用官方客户端连接工具 可能会有兼容性问题
-
-
开发篇
Struts项目连接MogDB 改造
pom依赖
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.3.3</version> </dependency>
连接池配置这里用的是 Ibatis POOLED 连接池
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>
其他存储过程参考
-
运维篇
建议使用官方推荐客户端连接工具
可以窗口化完成日常工作并且也可以查询窗口操作的示例代码
#创建用户
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周就完成了数据库切换其他内容边学边补充,也欢迎大神指导
评论区