你的位置:婷儿 户外 > 抖阴视频 >
  • 伪娘 露出 国产适配之MySQL替换为达梦8数据库

    发布日期:2024-09-08 18:24    点击次数:202

    伪娘 露出 国产适配之MySQL替换为达梦8数据库

    1. 配景

    技俩中要作念国产化伪娘 露出,MySQL要替换成达梦8数据库。技俩中MySQL的建表语句和内置数据通过.sql文献诊治,装置时会运行化表结构和表内置数据。技俩架构为SpringBoot + JPA / Mybatis。适配使命骨子包括数据库迁徙、数据导出、技俩中的成立蜕变和议论问题经管决策。

    色色淫2. 数据处理经过1. 前期装备1. 装置达梦8数据库

    达梦官网有提供装置包,把柄我方的场景进行礼聘,linux_x86或者linux_aarch64,由于咱们技俩要全面国产化,是以就业器用的国产华为的鲲鹏就业器(aarch64),操作系统为国产星河麒麟V10。装置阵势按官网提供的文档就行,下载后装置包里也会有一些PDF讲明文档可参考。

    2. 创建库,启动

    装置时如果礼聘了图形化界面装置,则有DM数据库成立助手器用,可用此器用来创建数据库实例,成立的话中间有个大小写是否敏锐成立,此成立默许礼聘不敏锐,不然可能背面会有坑(背面说),装置时紧记把客户端也选上,背面用其客户端进行操作,其他成立的话默许就行。装置完成后其中默许用户为SYSDBA,默许端口为5236。linux环境创建数据库实例传送:dm实例创建阵势

    2. 库数据处理

    这一步的处理主淌若将之前技俩中存储的.sql文献中MySQL的表结构和表数据议论sql颐养为达梦数据库所辅助的sql,而况一样保存为.sql文献,后续技俩运行之前径直用sql文献进行建表导数据等运行化操作。好像念念想如下:

    1.先把之前sql文献(MySQL)导入到MySQL数据库中

    2.讹诈达梦的数据迁徙器用把MySQL库中的数据迁徙到达梦数据库中

    3.讹诈达梦数据库迁徙器用把达梦数据库中的数据导出到sql文献,此时sql文献中的sql语句就可在达梦数据库中本质

    1. 数据迁徙

    如果装置时礼聘装置了客户端器用,则会生成一些客户端操作器用,如迁徙器用、DM经管器用、SQL交互式查询器用等。迁移时礼聘DM数据迁徙器用,按照器用内的阵势,礼聘MySQL就业和数据库以及要迁徙的DM数据库。

    图片

    1.新建迁徙,按需礼聘,我这边是MySQL -> DM。

    2.礼聘数据源迁移时不错指定Mysql数据库的驱动,成立一下jdbc驱动和齐集参数即可。达梦的话便是用默许驱动即可。

    图片

    3.迁徙计谋,可礼聘保捏对象名大小写,如果MySQL中表字段有效到json类型的字段时,需要手动成立一下类型映射关系伪娘 露出,将JSON转成VARCHAR,并设立长度,因为达梦没不辅助json类型,迁移时他会默许转成VARCHAR,然则长度会变得很大(具体健忘了),这时某些场景查询时会报错,成立成8188即可,按图成立即可

    图片

    图片

    4.背面礼聘迁徙格式的话全选即可,没什么需要突出留意的点

    2.数据导出

    第三步迁徙完成后,此时达梦数据库仍是有和MySQL同名的库(dm中是schema成见)和表数据了。接下来要把库中的数据导出为.sql文献,到时代放到技俩中装置时用来运行化表及数据。

    此时仍然需要用达梦的数据迁徙器用,新建数据迁徙,礼聘数据迁徙面目为DM -> SQL,然后指定需要迁徙的数据源(达梦中的scheme),然后导出到指标文献即可。

    图片

    3. 技俩适配(重心)1. 库名问题

    问题:导出后的达梦sql剧本你会发现,建表语句阵势为schema.table,而况主键自增要津字造成了IDENTITY。技俩中如果用SYSDBA用户齐集或者别的用户齐集时,本质sql语句皆要加上schema(不错衔接为mysql的库名,后续就说库名了),如select * from “MY_DB”.“T_USER_TEST”,如不加库名则会报错,天然不可能把技俩中所有的sql皆改一遍

    -- mysql
    CREATE TABLE `T_USER_TEST`
    (
     "id" BIGINT NOT NULL AUTO_INCREMENT,//主键自增
     "name" VARCHAR(255) NULL
    );
    -- 达梦
    CREATE TABLE "MY_DB"."T_USER_TEST"
    (
     "id" BIGINT IDENTITY(1,2) NOT NULL,//主键自增
     "name" VARCHAR(255) NULL
    );

    经管决策:创建一个用户,用户名为库名,创建用户后达梦会自动创建一个和用户名疏浚的库,此时用此用户登录齐集,本质sql语句时表名前边就不需要加库名了,因为他默许查的便是此用户下的库。语句如下(包括创建表空间、赋权等),后续齐集时使用此账号和密码以及url鸠聚合的schema(MY_DB)

    -- 创建表空间MY_DB
    CREATE tablespace MY_DB DATAFILE 'MY_DB.DBF' SIZE 128;
    -- 创建用户MY_DB,密码为123456,此时会自动创建名为MY_DB的schema
    CREATE USER "MY_DB" IDENTIFIED BY "123456" DEFAULT tablespace MY_DB;
    -- 为MY_DB用户赋权
    grant "DBA","RESOURCE","PUBLIC","SOI" to "MY_DB" with admin option;
    grant EXECUTE on "SYS"."DBMS_XMLGEN" to "MY_DB";

    Spring数据库齐集成立参考:

    #dm8齐集
    spring.datasource.url=jdbc:dm://127.0.0.1:5236/MY_DB
    spring.datasource.username=MY_DB
    spring.datasource.password=123456
    spring.datasource.driver-class-name=dm.jdbc.driver.DmDriver
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    
    #如果技俩中有使用到JPA,参考如下方言成立
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DmDialect
    spring.jpa.properties.hibernate.hbn2ddl.auto=none
    spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
    2. 主键自增问题1. 问题判辨

    当先,达梦数据库是辅助主键自增的,DDL中自增要津字为IDENTITY,假如咱们表中的id字段设立的为自增id,insert语法常见如下三种:

    -- 如下建表语句,id为自增id
    CREATE TABLE "MY_DB"."t_user_test"
    (
     "id" BIGINT IDENTITY(1,2) NOT NULL,//主键自增
     "name" VARCHAR(255) NULL
    );
    
    -- 1.insert的正确姿势,此时会生成则增id
    insert into "t_user_test"(name) values("tom");
    
    -- 2.差错示范,此时会报错:仅当指定列列表,且SET IDENTITY_INSERT为ON时,智商对自增列赋值
    insert into "t_user_test"(id,name) values(1,"tom");
    -- 3.差错示范,此时会报错: 仅当指定列列表,且SET IDENTITY_INSERT为ON时,智商对自增列赋值或者违背列[id]非空拘谨
    insert into "t_user_test"(id,name) values(null,"tom");

    1.第一种插入没问题,无可厚非

    2.第二种插入会报错,意旨有趣便是说,你的id设立的为自增列,然则你插入时对自增列手动赋值,这是不允许的,设立了自增就应该用数据库的自增生成。然则技俩中未免有手动设立id插入的场景,此时亦然有经管决策的,便是在插入之前设立IDENTITY_INSERT为ON。留意IDENTITY_INSERT要津字是表级别的要津字,语法要指定到表,不可对全库进行设立。

    -- 设立t_user_test表
    SET IDENTITY_INSERT MY_DB.t_user_test ON
    insert into("id","name") values(1,"tom");
    -- OFF不错不本质,不影响
    SET IDENTITY_INSERT MY_DB.t_user_test OFF

    针对IDENTITY_INSERT问题,本东说念主作念了一些测试,得出以下论断供参考:

    如需要使用数据库主键自增特色,需要在主键列上声明IDENTITY

    当insert语句时,如果手动设立id值,则需要设立此表的IDENTITY_INSERT为 ON

    本质完不关闭(SET IDENTITY_INSERT MY_DB.t_user_test OFF),再次插入id为空的值如故不错自增的

    不同会话之间本质SET IDENTITY_INSERT MY操作不会彼此影响

    并吞会话并吞技巧只可有一张表IDENTITY_INSERT 设立为ON,背面会灭绝前边的,并吞会话屡次设立唯有临了一次设立奏效

    当insert语句中,如果id清楚插入,而况value为null,则会报非空拘谨的问题

    开启语句:SET IDENTITY_INSERT db.table ON

    关闭语句:SET IDENTITY_INSERT db.table OFF

    3.第三种插入报错很赫然,当你莫得设立IDENTITY_INSERT时,他会先报错让你对其设立为ON,如果设立完后就会报错违背id非空拘谨,因为id建表时为主键,自带非空拘谨。不可清楚插入null值,此种差错只可对sql进行处理,背面会讲。

    2. 问题处理

    经过以上问题分析,insert某张表时,不错先设立IDENTITY_INSERT为ON,天然唯有第一种insert不需要设立,不错径直走自增,然则你设立后也不会影响insert的本质,为了偷懒不想整理技俩中的sql,索性所有insert皆设立IDENTITY_INSERT为ON。天然你不错写sql,修改技俩中的代码,在所有insert操作之前皆本质一遍INDENTITY_INSERT ON,然则代码中捏久层框架用了JPA和Mybatis,而况此类sql好多,是以选用AOP的面目经管。

    JPA

    经管念念路:在咱们技俩中使用JPA保存对象杀青插入皆是波折调用JpaRepository.save()步调,是以在此步调加一层遏制处理就行了,本质save之前先本质SET IDENTITY_INSERT ON伪娘 露出,参考代码如下:

    @Aspect
    @Component
    public class JpaSaveAspect {
    
        public static final String IDENTITY_INSERT_ON = "SET IDENTITY_INSERT MY_DB.%s ON";
        public static final String IDENTITY_INSERT_OFF = "SET IDENTITY_INSERT MY_DB.%s OFF";
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
       // 节点为JpaRepository.save
        @Pointcut("execution(* org.springframework.data.jpa.repository.JpaRepository.save(..))")
        public void savePointcut() {
        }
    
       //本质切点步调之前要进行的处理
        @Before("savePointcut()")
        public void beforeSave(JoinPoint joinPoint) {
            Object[] args = joinPoint.getArgs();
            if (Objects.isNull(args)