MySQL?遷移OB?Oracle場(chǎng)景中自增主鍵實(shí)踐操作
背景
本文驗(yàn)證并總結(jié)了在 OB Oracle 中實(shí)現(xiàn)自增主鍵的兩種方法。
在 MySQL 遷移到 OB Oracle 的場(chǎng)景中,通常需要考慮 OB Oracle 中自增主鍵如何實(shí)現(xiàn)的問(wèn)題。之前在社區(qū)已有文章給出了一些解決方案。
本文將從解決實(shí)際問(wèn)題的角度出發(fā),驗(yàn)證并總結(jié)一個(gè)比較可行的實(shí)施方案。
方案一
我們將通過(guò)創(chuàng)建創(chuàng)建自定義序列的方式來(lái)實(shí)現(xiàn)自增主鍵。
MySQL 端創(chuàng)建測(cè)試表
zlm@10.186.60.68 [zlm]> desc t; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | name | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec) zlm@10.186.60.68 [zlm]> select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+ 3 rows in set (0.00 sec)
使用 DBCAT 導(dǎo)出表結(jié)構(gòu)
DBCAT 是 OB 提供的命令行工具,主要用于異構(gòu)數(shù)據(jù)庫(kù)遷移場(chǎng)景中非表對(duì)象的 DDL 導(dǎo)出和轉(zhuǎn)換,如: Oracle 中的序列、函數(shù)、存儲(chǔ)過(guò)程、包、觸發(fā)器、視圖等對(duì)象。
cd /opt/oceanbase_package/tools/dbcat-1.9.1-RELEASE/bin ./dbcat convert -H 10.186.60.68 -P 3332 --user=zlm --password=zlm --database=zlm --no-schema --no-quote --from mysql57 --to oboracle32x --table t --file=/tmp Parsed args: [--no-quote] true [--no-schema] true [--table] [t] [--host] 10.186.60.68 [--port] 3332 [--user] zlm [--password] ****** [--database] zlm [--file] /tmp [--from] mysql57 [--to] oboracle32x 2023-08-16 14:41:58 INFO Init convert config finished. 2023-08-16 14:41:58 INFO {dataSource-1} inited 2023-08-16 14:41:58 INFO Init source druid connection pool finished. 2023-08-16 14:41:58 INFO Register c.o.o.d.m.c.m.MySql56ObOracle22xColumnConverter 2023-08-16 14:41:58 INFO Register c.o.o.d.m.c.m.MySql56ObOracle22xIndexConverter 2023-08-16 14:41:58 INFO Register c.o.o.d.m.c.m.MySql56ObOracle22xPrimaryKeyConverter 2023-08-16 14:41:58 INFO Register c.o.o.d.m.c.m.MySql56ObOracle22xUniqueKeyConverter 2023-08-16 14:41:58 INFO Register c.o.o.d.m.c.m.MySql56ObOracle22xPartitionConverter 2023-08-16 14:41:59 INFO Load meta/mysql/mysql56.xml, meta/mysql/mysql57.xml successed 2023-08-16 14:42:09 INFO Query 0 dependencies elapsed 17.35 ms 2023-08-16 14:42:09 INFO Query table: "t" attr finished. Remain: 0 2023-08-16 14:42:09 INFO Query 1 tables elapsed 69.71 ms 2023-08-16 14:42:09 WARN Include types is empty. Ignore schema: ZLM 2023-08-16 14:42:09 WARN Skip to compare/convert sequences as SEQUENCE is unsupported 2023-08-16 14:42:09 INFO Starting to convert schema to path: "/tmp/dbcat-2023-08-16-144209/ZLM" 2023-08-16 14:42:09 INFO Successed to generate report in the path: "/tmp/dbcat-2023-08-16-144209/ZLM-conversion.html" 2023-08-16 14:42:09 INFO {dataSource-1} closing ... 2023-08-16 14:42:09 INFO {dataSource-1} closed cd /tmp/dbcat-2023-08-16-144209/ZLM cat TABLE-schema.sql CREATE TABLE t ( id NUMBER(19,0), name VARCHAR2(30 BYTE), CONSTRAINT PRIMARY PRIMARY KEY (id) ); -- CREATE SEQUENCE xxx START WITH 1 INCREMENT BY 1 ... for t
DBCAT 會(huì)對(duì)目標(biāo)表的表結(jié)構(gòu)做轉(zhuǎn)換,使其符合 Oracle 的語(yǔ)法,并在導(dǎo)出的 DDL 語(yǔ)句中寫(xiě)入一行創(chuàng)建序列的偽 SQL ,可見(jiàn),此工具也是建議創(chuàng)建序列來(lái)處理 MySQL 自增列的。
在 OB 目標(biāo)端創(chuàng)建序列
- 對(duì)于含有自增列的每個(gè)表,都需要?jiǎng)?chuàng)建一個(gè)序列與之對(duì)應(yīng)。
- 創(chuàng)建序列時(shí),建議以
SEQ_<表名>_<字段名>
的方式命名。 - 當(dāng)不指定序列的
CYCLE
和 ORDER 屬性時(shí),其默認(rèn)值都是 N ,即:不循環(huán),不排序。 - 當(dāng)不指定序列的 CACHE 屬性時(shí),默認(rèn)緩存 20 個(gè)序列。
- 字段
MIN_VALUE
對(duì)應(yīng)創(chuàng)建序列時(shí) MIN_VALUE 屬性的值。 - 字段
LAST_NUMBER
對(duì)應(yīng)創(chuàng)建序列時(shí) START WITH 屬性的值。
ZLM[ZLM]> CREATE SEQUENCE SEQ_T_ID MINVALUE 1 MAXVALUE 999999 INCREMENT BY 1 START WITH 1; Query OK, 0 rows affected (0.03 sec) ZLM[ZLM]> SELECT SEQUENCE_NAME,MIN_VALUE,LAST_NUMBER,CYCLE_FLAG,ORDER_FLAG,CACHE_SIZE FROM DBA_SEQUENCES WHERE SEQUENCE_OWNER='ZLM'; +---------------+-----------+-------------+------------+------------+------------+ | SEQUENCE_NAME | MIN_VALUE | LAST_NUMBER | CYCLE_FLAG | ORDER_FLAG | CACHE_SIZE | +---------------+-----------+-------------+------------+------------+------------+ | SEQ_T_ID | 1 | 1 | N | N | 20 | +---------------+-----------+-------------+------------+------------+------------+ 1 row in set (0.01 sec) ZLM[ZLM]> drop sequence SEQ_T_ID; Query OK, 0 rows affected (0.03 sec) ZLM[ZLM]> CREATE SEQUENCE SEQ_T_ID MINVALUE 1 MAXVALUE 999999 INCREMENT BY 1 START WITH 10; Query OK, 0 rows affected (0.03 sec) ZLM[ZLM]> SELECT SEQUENCE_NAME,MIN_VALUE,LAST_NUMBER,CYCLE_FLAG,ORDER_FLAG,CACHE_SIZE FROM DBA_SEQUENCES WHERE SEQUENCE_OWNER='ZLM'; +---------------+-----------+-------------+------------+------------+------------+ | SEQUENCE_NAME | MIN_VALUE | LAST_NUMBER | CYCLE_FLAG | ORDER_FLAG | CACHE_SIZE | +---------------+-----------+-------------+------------+------------+------------+ | SEQ_T_ID | 1 | 10 | N | N | 20 | +---------------+-----------+-------------+------------+------------+------------+ 1 row in set (0.03 sec)
在 OB 目標(biāo)端建表
基于第 1 步獲取的 DDL 和第 2 步創(chuàng)建的序列。
ZLM[ZLM]> CREATE TABLE "ZLM"."T" ( -> "ID" NUMBER(19,0) DEFAULT SEQ_T_ID.NEXTVAL, -> "NAME" VARCHAR2(30 BYTE), -> CONSTRAINT "PRIMARY" PRIMARY KEY ("ID")); Query OK, 0 rows affected (0.15 sec)
通常表結(jié)構(gòu)及數(shù)據(jù)都是通過(guò) OMS 來(lái)完成遷移的,很少會(huì)直接用 DBCAT 生成的 DDL 建表語(yǔ)句去目標(biāo)端手動(dòng)建表,除了一些較特殊的場(chǎng)景,如以上這種給字段增加缺省屬性為序列值情況。
建表時(shí)注意:
應(yīng)將表名和字段名都改為大寫(xiě),因?yàn)?Oracle 中嚴(yán)格區(qū)分?jǐn)?shù)據(jù)庫(kù)對(duì)象的大小寫(xiě)。
ID 列的 DEFAULT 值,指定為第 2 步所創(chuàng)建序列的下一個(gè)值,即:SEQ_T_ID.NEXTVAL
使用 DataX 遷移數(shù)據(jù)
DataX 是阿里開(kāi)源的離線數(shù)據(jù)同步工具,支持多種異構(gòu)數(shù)據(jù)源,可以通過(guò) OB 的 Reader 和 Writer 插件實(shí)現(xiàn) OB 與異構(gòu)數(shù)據(jù)庫(kù)之間的數(shù)據(jù)遷移。
-- 創(chuàng)建 DataX 配置文件(存放在 dataX 的 ./job 目錄下) cat t.json { "job": { "setting": { "speed": { "channel": 4 }, "errorLimit": { "record": 0, "percentage": 0.1 } }, "content": [ { "reader": { "name": "mysqlreader", "parameter": { "username": "zlm", "password": "zlm", "column": [ "*" ], "connection": [ { "table": [ "t" ], "jdbcUrl": ["jdbc:mysql://10.186.60.68:3332/zlm?useUnicode=true&characterEncoding=utf8"] } ] } }, "writer": { "name": "oceanbasev10writer", "parameter": { "obWriteMode": "insert", "column": [ "*" ], "preSql": [ "truncate table T" ], "connection": [ { "jdbcUrl": "||_dsc_ob10_dsc_||jingbo_ob:ob_oracle||_dsc_ob10_dsc_||jdbc:oceanbase://10.186.65.22:2883/ZLM?useLocalSessionState=true&allowBatch=true&allowMultiQueries=true&rewriteBatchedStatements=true", "table": [ "T" ] } ], "username": "ZLM", "password":"zlm", "writerThreadCount":10, "batchSize": 1000, "memstoreThreshold": "0.9" } } } ] } } -- 執(zhí)行數(shù)據(jù)遷移 ./bin/datax.py job/t.json DataX (20220610-external), From Alibaba ! Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved. full db is not specified. schema sync is not specified. java -server -Xms4g -Xmx16g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/datax3/log -DENGINE_VERSION=20220610-external -Xms4g -Xmx16g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/datax3/log -Dloglevel=info -Dproject.name=di-service -Dfile.encoding=UTF-8 -Dlogback.statusListenerClass=ch.qos.logback.core.status.NopStatusListener -Djava.security.egd=file:///dev/urandom -Ddatax.home=/home/admin/datax3 -Dlogback.configurationFile=/home/admin/datax3/conf/logback.xml -classpath /home/admin/datax3/lib/*:. -Dlog.file.name=in_datax3_job_t_json com.alibaba.datax.core.Engine -mode standalone -jobid -1 -job /home/admin/datax3/job/t.json -fulldb false -schema false 2023-08-16 14:58:41.088 [main] INFO Engine - running job from /home/admin/datax3/job/t.json 2023-08-16 14:58:41.374 [main] INFO VMInfo - VMInfo# operatingSystem class => sun.management.OperatingSystemImpl 2023-08-16 14:58:41.382 [main] INFO Engine - the machine info => 略... 2. record average count and max count task info : PHASE | AVERAGE RECORDS | AVERAGE BYTES | MAX RECORDS | MAX RECORD`S BYTES | MAX TASK ID | MAX TASK INFO READ_TASK_DATA | 3 | 6B | 3 | 6B | 0-0-0 | t,jdbcUrl:[jdbc:mysql://10.186.60.68:3332/zlm] 2023-08-16 14:58:45.189 [job-0] INFO MetricReportUtil - reportJobMetric is turn off 2023-08-16 14:58:45.189 [job-0] INFO StandAloneJobContainerCommunicator - Total 3 records, 6 bytes | Speed 3B/s, 1 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 100.00% 2023-08-16 14:58:45.190 [job-0] INFO LogReportUtil - report datax log is turn off 2023-08-16 14:58:45.190 [job-0] INFO JobContainer - 任務(wù)啟動(dòng)時(shí)刻 : 2023-08-16 14:58:41 任務(wù)結(jié)束時(shí)刻 : 2023-08-16 14:58:45 任務(wù)總計(jì)耗時(shí) : 3s 任務(wù)平均流量 : 3B/s 記錄寫(xiě)入速度 : 1rec/s 讀出記錄總數(shù) : 3 讀寫(xiě)失敗總數(shù) : 0 2023-08-16 14:58:45.190 [job-0] INFO PerfTrace - reset PerfTrace.
驗(yàn)證效果
驗(yàn)證主鍵列能否實(shí)現(xiàn)自增。
SYS[ZLM]> select * from t; +----+------+ | ID | NAME | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+ 3 rows in set (0.01 sec) SYS[ZLM]> insert into t(name) values('d'); Query OK, 1 row affected (0.02 sec) SYS[ZLM]> select * from t; +----+------+ | ID | NAME | +----+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | +----+------+ 4 rows in set (0.00 sec)
新插入的數(shù)據(jù)每次都會(huì)先獲取 ID 列上序列的 NEXTVAL 值,于是就實(shí)現(xiàn)了主鍵自增的需求。
使用自定義序列的 NEXTVAL 作為主鍵列的 DEFAULT 值后,不必關(guān)心源端表上記錄的自增列最大值,將表遷移過(guò)去后,直接插入新數(shù)據(jù)時(shí),不會(huì)與原來(lái)的數(shù)據(jù)沖突。
方案二
利用 GENERATED BY DEFAULT AS IDENTITY 屬性生成序列的方案是否好用?先來(lái)看一個(gè)測(cè)試吧!
-- 刪除并重建測(cè)試表 ZLM[ZLM]> DROP TABLE T; Query OK, 0 rows affected (0.10 sec) ZLM[ZLM]> CREATE TABLE "ZLM"."T" ( -> "ID" NUMBER(19,0) GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 999999, -> "NAME" VARCHAR2(30 BYTE), -> CONSTRAINT "PRIMARY" PRIMARY KEY ("ID")); Query OK, 0 rows affected (0.15 sec) -- 查看序列 ZLM[ZLM]> SELECT SEQUENCE_NAME,MIN_VALUE,LAST_NUMBER,CYCLE_FLAG,ORDER_FLAG,CACHE_SIZE FROM DBA_SEQUENCES WHERE SEQUENCE_OWNER='ZLM'; +-----------------+-----------+-------------+------------+------------+------------+ | SEQUENCE_NAME | MIN_VALUE | LAST_NUMBER | CYCLE_FLAG | ORDER_FLAG | CACHE_SIZE | +-----------------+-----------+-------------+------------+------------+------------+ | SEQ_T_ID | 1 | 21 | N | N | 20 | | ISEQ$$_50034_16 | 1 | 1 | N | N | 20 | +-----------------+-----------+-------------+------------+------------+------------+ 2 rows in set (0.00 sec) # 此時(shí),系統(tǒng)自動(dòng)創(chuàng)建了名為 ISEQ$$_50034_16 的序列,其他默認(rèn)值與自定義創(chuàng)建的序列一致 -- 查看表結(jié)構(gòu) ZLM[ZLM]> desc t; +-------+--------------+------+-----+------------------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+------------------+-------+ | ID | NUMBER(19) | NO | PRI | SEQUENCE.NEXTVAL | NULL | | NAME | VARCHAR2(30) | YES | NULL| NULL | NULL | +-------+--------------+------+-----+------------------+-------+ 2 rows in set (0.02 sec) # 注意,ID 列的 DEFAULT 值為 SEQUENCE.NEXTVAL ,而不是 ISEQ$$_50034_16.NEXTVAL -- 重新導(dǎo)入數(shù)據(jù) ./bin/datax.py job/t.json 略 ... -- 插入數(shù)據(jù) ZLM[ZLM]> insert into t(name) values('d'); ORA-00001: unique constraint '1' for key 'PRIMARY' violated ZLM[ZLM]> insert into t(name) values('d'); ORA-00001: unique constraint '2' for key 'PRIMARY' violated ZLM[ZLM]> insert into t(name) values('d'); ORA-00001: unique constraint '3' for key 'PRIMARY' violated ZLM[ZLM]> insert into t(name) values('d'); Query OK, 1 row affected (0.01 sec) ZLM[ZLM]> select "ISEQ$$_50034_16".CURRVAL from dual; +---------+ | CURRVAL | +---------+ | 4 | +---------+ 1 row in set (0.00 sec)
表中有 3 條數(shù)據(jù),當(dāng)執(zhí)行插入時(shí),START WITH 實(shí)際上還是從默認(rèn)值 1 開(kāi)始的。
每次執(zhí)行插入,ID 都會(huì)獲取序列的 NEXTVAL 值,直到執(zhí)行至第 4 次,未與表中已有記錄沖突,才能插入成功。
對(duì)于這種場(chǎng)景,解決方案有兩種,不過(guò)都比較繁瑣:
- 插入記錄前先獲取當(dāng)前序列的 NEXTVAL 值(需多次執(zhí)行,執(zhí)行次數(shù) = 源端表記錄數(shù))。
- 創(chuàng)建序列時(shí)根據(jù)源端表上自增列最大值來(lái)指定 START WITH 屬性。
注意:
使用 GENERATED BY DEFAULT AS IDENTITY 屬性生成的序列無(wú)法直接刪除,會(huì)報(bào)錯(cuò)。
ORA-32794: cannot drop a system-generated sequence
獲取表中自增列最大值
方法 1:MAX 函數(shù)
zlm@10.186.60.68 [zlm]> SELECT MAX(id)+1 as AUTO_INCREMENT FROM t; +----------------+ | AUTO_INCREMENT | +----------------+ | 4 | +----------------+ 1 row in set (0.00 sec)
方法 2:系統(tǒng)視圖
zlm@10.186.60.68 [zlm]> select AUTO_INCREMENT from information_schema.tables where table_name='t'; +----------------+ | AUTO_INCREMENT | +----------------+ | 4 | +----------------+ 1 row in set (0.00 sec)
方法3:show create table 命令
zlm@10.186.60.68 [zlm]> show create table t\G *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
腳本初始化序列的一個(gè)示例
-- 刪除并重建表 ZLM[ZLM]> drop table t; Query OK, 0 rows affected (0.02 sec) ZLM[ZLM]> CREATE TABLE "ZLM"."T" ( -> "ID" NUMBER(19,0) GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 999999, -> "NAME" VARCHAR2(30 BYTE), -> CONSTRAINT "PRIMARY" PRIMARY KEY ("ID")); Query OK, 0 rows affected (0.04 sec) -- 導(dǎo)入數(shù)據(jù) ./bin/datax.py job/t.json 略 ... -- 執(zhí)行腳本并確認(rèn)返回結(jié)果正常 [root@10-186-65-73 ~]# cat init_sequence.sh #!/bin/bash ## 獲取當(dāng)前表自增列最大值 i=$(obclient -h10.186.60.68 -P3332 -uzlm -pzlm -Nse "SELECT MAX(id)+1 FROM zlm.t;" 2>/dev/null | head -1) ## 循環(huán)執(zhí)行SQL初始化序列值 for ((j=1; j<=$i; j++)) do obclient -h10.186.65.43 -P2883 -uZLM@ob_oracle#bobo_ob:1675327512 -pzlm -A -c -DZLM -Nse "select ISEQ\$\$_50037_16.nextval from dual;" 1>/dev/null 2>&1 done [root@10-186-65-73 ~]# sh init_sequence.sh [root@10-186-65-73 ~]# echo $? 0 -- 執(zhí)行插入 ZLM[ZLM]> insert into t(name) values('d'); Query OK, 1 row affected (0.01 sec)
序列經(jīng)過(guò)初始化處理后,當(dāng)完成數(shù)據(jù)導(dǎo)入并直接插入新增記錄時(shí),就不會(huì)再產(chǎn)生唯一性沖突的報(bào)錯(cuò)了。同樣地,先用腳本獲取到自增列的最大值,在創(chuàng)建序列時(shí)指定 START WITH 與自增列最大值一致,也可以解決以上問(wèn)題,這里不展開(kāi)了。
總體而言,GENERATED BY DEFAULT AS IDENTITY 屬性創(chuàng)建(方案二)的序列不如自定義序列(方案一)好用。
總結(jié)
本文驗(yàn)證并闡述了在 OB Oracle 中實(shí)現(xiàn)自增主鍵的兩種方法:創(chuàng)建自定義序列和利用 GENERATED BY DEFAULT AS IDENTITY 屬性生成序列。
方案一
創(chuàng)建自定義序列的時(shí),需要為每張有自增列的表創(chuàng)建一個(gè)單獨(dú)的序列,序列名建議與表名關(guān)聯(lián),但無(wú)需關(guān)注 START WITH 的取值。當(dāng)插入新記錄時(shí),會(huì)自動(dòng)去獲取下一個(gè)可用的序列值。
方案二
利用 GENERATED BY DEFAULT AS IDENTITY 屬性生成序列時(shí),存在一些限制:
- 因序列由系統(tǒng)自動(dòng)創(chuàng)建并管理,需要查詢系統(tǒng)視圖才能獲取序列名,無(wú)法與業(yè)務(wù)表名對(duì)應(yīng)。
- 創(chuàng)建序列時(shí)需要根據(jù)自增列最大值來(lái)指定 START WITH 的取值,當(dāng)有大量表需要處理時(shí),較繁瑣。
利用 GENERATED BY DEFAULT AS IDENTITY 屬性生成的序列名,在內(nèi)部有一個(gè)計(jì)數(shù)器,會(huì)累計(jì)增加,即使刪除了原來(lái)的序列,原有的名字也不會(huì)被重用。刪除表時(shí),會(huì)自動(dòng)清理由 GENERATED BY DEFAULT AS IDENTITY 屬性生成的序列(直接刪除該序列會(huì)報(bào)錯(cuò)),但不會(huì)影響之前創(chuàng)建的其他自定義序列。
采用 GENERATED BY DEFAULT AS IDENTITY 屬性生成序列的方案時(shí),還要額外考慮源端待遷移表當(dāng)前自增列最大值的問(wèn)題,這無(wú)疑增加了遷移的復(fù)雜度。
綜上所述,更推薦使用自定義序列實(shí)現(xiàn)自增主鍵的方案。
以上就是MySQL 遷移OB Oracle場(chǎng)景中自增主鍵實(shí)踐操作的詳細(xì)內(nèi)容,更多關(guān)于MySQL遷移OB Oracle自增主鍵的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL sum后再計(jì)算percentage的多種解決辦法
這篇文章主要介紹了MySQL sum后再計(jì)算percentage的多種解決辦法,over() 函數(shù),Cross Join,Select 嵌套查詢以及 with 函數(shù)處理,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-06-06MySql按時(shí),天,周,月進(jìn)行數(shù)據(jù)統(tǒng)計(jì)
這篇文章主要介紹了MySql按時(shí),天,周,月進(jìn)行數(shù)據(jù)統(tǒng)計(jì),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Mysql中禁用與啟動(dòng)觸發(fā)器教程【推薦】
在使用MYSQL過(guò)程中,經(jīng)常會(huì)使用到觸發(fā)器,但是有時(shí)使用不當(dāng)會(huì)造成一些麻煩。下面小編給大家?guī)?lái)了Mysql中禁用與啟動(dòng)觸發(fā)器教程,感興趣的朋友一起看看吧2018-08-08MySQL實(shí)現(xiàn)MYISAM表批量壓縮的方法
這篇文章主要介紹了MySQL實(shí)現(xiàn)MYISAM表批量壓縮的方法,實(shí)例分析了MySQL使用shell命令批量壓縮MYISAM表的相關(guān)技巧,需要的朋友可以參考下2016-04-04Navicat連接MySQL時(shí)報(bào)10060、1045錯(cuò)誤及my.ini位置問(wèn)題
這篇文章主要介紹了Navicat連接MySQL的10060及1045報(bào)錯(cuò),my.ini位置,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03master and slave have equal MySQL server ids
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids2013-07-07MySQL利用索引優(yōu)化ORDER BY排序語(yǔ)句的方法
這篇文章主要介紹了MySQL利用索引優(yōu)化ORDER BY排序語(yǔ)句的方法,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-10-10