本文档详细记录了从GBK字符集数据库迁移至UTF-8字符集数据库的全过程,包括环境准备、数据导出、数据导入及验证步骤,确保数据完整性与一致性。
一、字符集迁移改造的关键注意事项
备份完整性:确保导出前对GBK数据库进行完整备份(如上文的dexp操作)
环境一致性:
(1).在目标库创建相同的表空间结构
(2).重建相同的用户和权限体系
(3).保持表结构定义完全一致
工具版本:确保导入导出工具(dimp/dexp)版本兼容
二、最佳实践建议
三、以下是主体操作步骤
SQL> CREATE TABLESPACE DEVDEMO DATAFILE '/data/dmdata/DMDEV/DEVDEMO01.DBF' SIZE 128 AUTOEXTEND ON NEXT 20 MAXSIZE 10240;
操作已执行
已用时间: 109.688(毫秒). 执行号:67502.
SQL> CREATE TABLESPACE DEVIDX DATAFILE '/data/dmdata/DMDEV/EXAMDB/DEVIDX.DBF' SIZE 128 AUTOEXTEND ON NEXT 20 MAXSIZE 10240;
操作已执行
已用时间: 34.250(毫秒). 执行号:67503.
SQL> SELECT
RPAD(TABLESPACE_NAME, 15, ' ') AS "表空间",
SUBSTR(FILE_NAME, 1, 50) AS "文件路径",
LPAD(STATUS, 10, ' ') AS "状态",
LPAD(ONLINE_STATUS, 10, ' ') AS "在线状态",
LPAD(ROUND(BYTES/1024/1024, 2)::VARCHAR || ' MB', 12, ' ') AS "当前大小",
CASE
WHEN AUTOEXTENSIBLE = 'YES' THEN LPAD(ROUND(MAXBYTES/1024/1024/1024, 2)::VARCHAR || ' GB', 10, ' ')
ELSE 'N/A '
END AS "最大大小",
LPAD(AUTOEXTENSIBLE, 5, ' ') AS "自动扩展"
FROM DBA_DATA_FILES
ORDER BY TABLESPACE_NAME, FILE_ID;
行号 表空间 文件路径 状态 在线状态 当前大小 最大大小 自动扩展
---------- --------------- ------------------------------------ ---------- ------------ ------------ ------------ ------------
1 DEVDEMO /data/dmdata/DMDEV/DEVDEMO01.DBF AVAILABLE ONLINE 128 MB 10 GB YES
2 DEVIDX /data/dmdata/DMDEV/EXAMDB/DEVIDX.DBF AVAILABLE ONLINE 128 MB 10 GB YES
3 MAIN /data/dmdata/DMDEV/MAIN.DBF AVAILABLE ONLINE 128 MB 65536 GB YES
4 ROLL /data/dmdata/DMDEV/ROLL.DBF AVAILABLE ONLINE 128 MB 65536 GB YES
5 SYSTEM /data/dmdata/DMDEV/SYSTEM.DBF AVAILABLE ONLINE 276 MB 65536 GB YES
6 TEMP /data/dmdata/DMDEV/TEMP.DBF AVAILABLE ONLINE 74 MB 65536 GB YES
6 rows got
3.在GBK环境中创建模拟用户
SQL> CREATE USER DEVDEMO IDENTIFIED BY "xxxxxxxx" DEFAULT TABLESPACE DEVDEMO DEFAULT INDEX TABLESPACE DEVIDX;
操作已执行
已用时间: 20.400(毫秒). 执行号:67505.
SQL> GRANT RESOURCE, VTI TO DEVDEMO;
操作已执行
已用时间: 9.608(毫秒). 执行号:67506.
SQL> GRANT RESOURCE, VTI TO DEVDEMO;
操作已执行
已用时间: 4.618(毫秒). 执行号:67507.
SQL> CREATE TABLE DEVDEMO.DMDEV_DEMO (
PRODUCE_ORG_ID INT NOT NULL,
ID INT,
NAME VARCHAR(50) NOT NULL,
2 3 4 5 AGE INT,
EMAIL VARCHAR(100),
CREATE_TIME DATETIME DEFAULT SYSDATE,
6 7 8 STATUS CHAR(1) DEFAULT 'A',
SALARY DECIMAL(10,2),
REMARK TEXT,
CONSTRAINT PK_DMDEV_DEMO PRIMARY KEY (PRODUCE_ORG_ID)
USING INDEX TABLESPACE DEVIDX
9 10 11 12 13 ) STORAGE(ON DEVDEMO, CLUSTERBTR);
操作已执行
已用时间: 103.040(毫秒). 执行号:67508.
SQL> CREATE INDEX IDX_DMDEV_DEMO_NAME ON DEVDEMO.DMDEV_DEMO(NAME) TABLESPACE DEVIDX;
操作已执行
已用时间: 60.135(毫秒). 执行号:67509.
SQL> DESC DEVDEMO.DMDEV_DEMO;
行号 NAME TYPE$ NULLABLE
---------- -------------- ------------ --------
1 PRODUCE_ORG_ID INTEGER N
2 ID INTEGER Y
3 NAME VARCHAR(50) N
4 AGE INTEGER Y
5 EMAIL VARCHAR(100) Y
6 CREATE_TIME DATETIME(6) Y
7 STATUS CHAR(1) Y
8 SALARY DEC(10, 2) Y
9 REMARK TEXT Y
9 rows got
已用时间: 51.985(毫秒). 执行号:67510.
7.查看索引情况以用于恢复对比验证
SQL> SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS
FROM ALL_INDEXES
WHERE TABLE_NAME = 'DMDEV_DEMO' AND OWNER = 'DEVDEMO';
行号 INDEX_NAME TABLE_NAME UNIQUENESS
---------- ------------------- ---------- ----------
1 IDX_DMDEV_DEMO_NAME DMDEV_DEMO NONUNIQUE
2 INDEX33555472 DMDEV_DEMO UNIQUE
3 INDEX33555471 DMDEV_DEMO NONUNIQUE
已用时间: 399.753(毫秒). 执行号:67511.
SQL> INSERT INTO DEVDEMO.DMDEV_DEMO (PRODUCE_ORG_ID, ID, NAME, AGE, EMAIL, STATUS, SALARY, REMARK) VALUES
(1001, 1, '张三', 28, 'zhangsan@demo.com', 'A', 9500.00, '研发部工程师'),
2 3 (1002, 2, '李四', 32, 'lisi@demo.com', 'A', 12500.50, '高级产品经理'),
(1003, 3, '王五', 26, 'wangwu@demo.com', 'I', 8800.00, '测试工程师,已离职'),
4 5 (1004, 4, '赵六', 35, 'zhaoliu@demo.com', 'A', 18000.00, '架构师'),
6 (1005, 5, '钱七', 29, 'qianqi@demo.com', 'A', 10200.75, '前端开发'),
7 (1006, 6, '孙八', 31, 'sunba@demo.com', 'A', 11000.00, '后端开发'),
8 (1007, 7, '周九', 27, 'zhoujiu@demo.com', 'A', 9300.25, '运维工程师'),
(1008, 8, '吴十', 33, 'wushi@demo.com', 'A', 13500.00, '数据库管理员'),
9 10 (1009, 9, '郑一', 30, 'zhengyi@demo.com', 'I', 9800.00, '原UI设计师'),
11 (1010, 10, '冯二', 25, 'fenger@demo.com', 'A', 8500.00, '实习生转正'),
12 (1011, 11, '陈三', 34, 'chensan@demo.com', 'A', 15000.00, '技术经理'),
13 (1012, 12, '褚四', 28, 'chusi@demo.com', 'A', 10500.00, 'Java开发'),
14 (1013, 13, '卫五', 29, 'weiwu@demo.com', 'A', 10800.50, 'Python工程师'),
15 (1014, 14, '蒋六', 36, 'jiangliu@demo.com', 'A', 19000.00, '首席技术官'),
(1015, 15, '沈七', 27, 'shenqi@demo.com', 'A', 9200.00, '初级开发'),
16 17 (1016, 16, '韩八', 32, 'hanba@demo.com', 'A', 12000.00, '全栈工程师'),
(1017, 17, '杨九', 30, 'yangjiu@demo.com', 'I', 10000.00, '已调岗'),
(1018, 18, '朱十', 26, 'zhushi@demo.com', 'A', 8900.75, '大数据开发'),
18 19 20 (1019, 19, '秦一', 31, 'qinyi@demo.com', 'A', 11500.00, '安全工程师'),
21 (1020, 20, '尤二', 28, 'youer@demo.com', 'A', 9700.25, '算法工程师');
影响行数 20
9.确认当前数据库的字符集
SQL> SELECT SF_GET_UNICODE_FLAG() AS UNICODE_FLAG;
行号 UNICODE_FLAG
---------- ------------
1 0
已用时间: 5.251(毫秒). 执行号:67526.
0表示字符集为GBK
SQL> select * from DEVDEMO.DMDEV_DEMO where id>11;
行号 PRODUCE_ORG_ID ID NAME AGE EMAIL CREATE_TIME STATUS SALARY REMARK
---------- -------------- ----------- ------ ----------- ----------------- -------------------------- ------ ------- ---------------
1 1012 12 褚四 28 chusi@demo.com 2025-12-04 16:06:25.000000 A 10500 Java开发
2 1013 13 卫五 29 weiwu@demo.com 2025-12-04 16:06:25.000000 A 10800.5 Python工程师
3 1014 14 蒋六 36 jiangliu@demo.com 2025-12-04 16:06:25.000000 A 19000 首席技术官
4 1015 15 沈七 27 shenqi@demo.com 2025-12-04 16:06:25.000000 A 9200 初级开发
5 1016 16 韩八 32 hanba@demo.com 2025-12-04 16:06:25.000000 A 12000 全栈工程师
6 1017 17 杨九 30 yangjiu@demo.com 2025-12-04 16:06:25.000000 I 10000 已调岗
7 1018 18 朱十 26 zhushi@demo.com 2025-12-04 16:06:25.000000 A 8900.75 大数据开发
8 1019 19 秦一 31 qinyi@demo.com 2025-12-04 16:06:25.000000 A 11500 安全工程师
9 1020 20 尤二 28 youer@demo.com 2025-12-04 16:06:25.000000 A 9700.25 算法工程师
SQL> select count(*) from DEVDEMO.DMDEV_DEMO;
行号 COUNT(*)
---------- --------------------
1 20
已用时间: 4.518(毫秒). 执行号:802.
SELECT
'CREATE TABLESPACE ' || t.NAME ||
' DATAFILE ''' || d.PATH || ''' SIZE ' ||
CAST(ROUND(CAST(d.TOTAL_SIZE AS DECIMAL(38,0)) * d.PAGE_SIZE / 1024 / 1024) AS BIGINT) ||
CASE
WHEN d.AUTO_EXTEND = 1 THEN
' AUTOEXTEND ON NEXT ' ||
CAST(ROUND(CAST(d.NEXT_SIZE AS DECIMAL(38,0)) * d.PAGE_SIZE / 1024 / 1024) AS BIGINT) ||
CASE
WHEN d.MAX_SIZE > 0 THEN
' MAXSIZE ' || CAST(ROUND(CAST(d.MAX_SIZE AS DECIMAL(38,0)) * d.PAGE_SIZE / 1024 / 1024) AS BIGINT)
ELSE ''
END
ELSE ''
END || ';' AS CREATE_TABLESPACE_SQL
FROM
V$TABLESPACE t
JOIN
(SELECT *, ROW_NUMBER() OVER (PARTITION BY GROUP_ID ORDER BY ID) AS rn FROM V$DATAFILE) d
ON t.ID = d.GROUP_ID AND d.rn = 1
WHERE
t.NAME NOT IN ('SYSTEM', 'ROLL', 'TEMP', 'MAIN')
ORDER BY
t.NAME;
行号 CREATE_TABLESPACE_SQL
---------- -------------------------------------------------------------------------------------------------------------------
1 CREATE TABLESPACE DEVDEMO DATAFILE '/data/dmdata/DMDEV/DEVDEMO01.DBF' SIZE 128 AUTOEXTEND ON NEXT 1 MAXSIZE 320;
2 CREATE TABLESPACE DEVIDX DATAFILE '/data/dmdata/DMDEV/EXAMDB/DEVIDX.DBF' SIZE 128 AUTOEXTEND ON NEXT 1 MAXSIZE 320;
[root@192.168.1.1 ~]# mkdir -p /data/backup/dexp
[root@192.168.1.1 ~]# chown dmdba:dinstall /data/backup/ -R
[dmdba@192.168.1.1 ~]$ cd /data/dm8/bin
[dmdba@192.168.1.1 bin]$ ./dexp USERID=SYSDBA/'"*************"'@192.168.1.1:5237 DIRECTORY=/dm/backup/dexp FILE=DEVDEMO.dmp OWNER=DEVDEMO LOG=DEVDEMO.log
dexp V8
version: 03134284368-20250430-272000-20149 Pack1
start dexp:
SYSDBA/******@192.168.1.1:5237 DIRECTORY=/dm/backup/dexp FILE=DEVDEMO.dmp OWNER=DEVDEMO LOG=DEVDEMO.log
导出对象类型:USER
表DEVDEMO.DMDEV_DEMO导出结束,共导出 20 行数据, 大小 1.657 KB
共导出 1 个TABLE
模式[DEVDEMO]导出结束.....
成功导出 第1 个SCHEMA :DEVDEMO
共导出 1 个SCHEMA
整个导出过程共花费 230.598 s
[root@192.168.1.1 ~]# cd /dm/backup/dexp
[root@192.168.1.1 dexp]# ll
总用量 32
-rw-r--r-- 1 dmdba dinstall 7182 12月 4 17:26 DEVDEMO.dmp
-rw-r--r-- 1 dmdba dinstall 805 12月 4 17:26 DEVDEMO.log
[dmdba@192 bin]$ ./disql SYSDBA/'"*************"'@192.168.1.2:5239
SQL>SELECT SF_GET_UNICODE_FLAG() AS UNICODE_FLAG;
行号 UNICODE_FLAG
---------- ------------
1 1
已用时间: 4.103(毫秒). 执行号:66701.
1表示字符集是UTF-8
SQL> CREATE TABLESPACE DEVDEMO DATAFILE '/data/dmdb/DMTE/DEVDEMO01.DBF' SIZE 128 AUTOEXTEND ON NEXT 20 MAXSIZE 10240;
操作已执行
已用时间: 297.262(毫秒). 执行号:502.
SQL> CREATE TABLESPACE DEVIDX DATAFILE '/data/dmdb/DMTE/DEVIDX.DBF' SIZE 128 AUTOEXTEND ON NEXT 20 MAXSIZE 10240;
操作已执行
已用时间: 111.308(毫秒). 执行号:503.
SQL> SELECT
RPAD(TABLESPACE_NAME, 15, ' ') AS "表空间",
SUBSTR(FILE_NAME, 1, 50) AS "文件路径",
LPAD(STATUS, 10, ' ') AS "状态",
LPAD(ONLINE_STATUS, 10, ' ') AS "在线状态",
LPAD(ROUND(BYTES/1024/1024, 2)::VARCHAR || ' MB', 12, ' ') AS "当前大小",
CASE
WHEN AUTOEXTENSIBLE = 'YES' THEN LPAD(ROUND(MAXBYTES/1024/1024/1024, 2)::VARCHAR || ' GB', 10, ' ')
ELSE 'N/A '
END AS "最大大小",
LPAD(AUTOEXTENSIBLE, 5, ' ') AS "自动扩展"
FROM DBA_DATA_FILES
ORDER BY TABLESPACE_NAME, FILE_ID;
行号 表空间 文件路径 状态 在线状态 当前大小 最大大小 自动扩展
---------- --------------- ----------------------------- ---------- ------------ ------------ ------------ ------------
1 DEVDEMO /data/dmdb/DMTE/DEVDEMO01.DBF AVAILABLE ONLINE 128 MB 10 GB YES
2 DEVIDX /data/dmdb/DMTE/DEVIDX.DBF AVAILABLE ONLINE 128 MB 10 GB YES
3 MAIN /data/dmdb/DMTE/MAIN.DBF AVAILABLE ONLINE 128 MB 65536 GB YES
4 ROLL /data/dmdb/DMTE/ROLL.DBF AVAILABLE ONLINE 128 MB 65536 GB YES
5 SYSTEM /data/dmdb/DMTE/SYSTEM.DBF AVAILABLE ONLINE 276 MB 65536 GB YES
6 TEMP /data/dmdb/DMTE/TEMP.DBF AVAILABLE ONLINE 74 MB 65536 GB YES
SQL> CREATE USER DEVDEMO IDENTIFIED BY "xxxxxxxxx" DEFAULT TABLESPACE DEVDEMO DEFAULT INDEX TABLESPACE DEVIDX;
操作已执行
已用时间: 17.100(毫秒). 执行号:701.
SQL> GRANT RESOURCE, VTI TO DEVDEMO;
操作已执行
已用时间: 5.500(毫秒). 执行号:702.
SQL> GRANT RESOURCE, VTI TO DEVDEMO;
操作已执行
已用时间: 5.886(毫秒). 执行号:703.
SQL>
start dimp:
SYSDBA/******@192.168.1.2:5239 DIRECTORY=/dm/backup/dexp FILE=DEVDEMO.dmp REMAP_SCHEMA=DEVDEMO:DEVDEMO IGNORE_INIT_PARA=1 TABLE_EXISTS_ACTION=REPLACE LOG=remap_import.log
本地编码:PG_UTF8, 导入文件编码:PG_GB18030
[0/8]导入 GLOBAL 对象……
[0/8]导入 USER 对象 : DEVDEMO
[警告]Error Code:-2124,第1 行附近出现错误:
对象[DEVDEMO]已存在
[0/8]导入 SYS_PRIV 对象……
[1/8]导入 SR_PRIV 对象……
[2/8]导入 SR_PRIV 对象……
[3/8]导入 SR_PRIV 对象……
[4/8]GLOBAL 对象导入完毕……
[4/8]开始导入模式[DEVDEMO]......
[4/8]导入模式中的 NECESSARY GLOBAL 对象……
[4/8]模式中的 NECESSARY GLOBAL 对象导入完成……
----- [2025-12-04 21:43:29]导入表:DEVDEMO.DMDEV_DEMO -----
[4/8][表: DMDEV_DEMO]创建表 DEVDEMO.DMDEV_DEMO ...
[5/8][表: DMDEV_DEMO]创建表已完成,导入表 DMDEV_DEMO 的数据中...
表 DEVDEMO.DMDEV_DEMO 的数据导入完成,共导入数据:20 行, 大小 1.657 KB
[5/8][表: DMDEV_DEMO]导入表的索引:
[5/8][表: DMDEV_DEMO]IDX_DMDEV_DEMO_NAME
[6/8][表: DMDEV_DEMO]导入成功……
[6/8]导入模式中的 GLOBAL 对象……
[6/8]模式中的 GLOBAL 对象导入完成……
[6/8]模式[DEVDEMO]导入完成......
[7/8][表: DMDEV_DEMO]导入成功……
[7/8]整个导入过程共花费 9.117 s
成功终止导入, 出现1个警告
该告警是因为用户已存在,可以忽略
SQL> SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS
FROM ALL_INDEXES
WHERE TABLE_NAME = 'DMDEV_DEMO' AND OWNER = 'DEVDEMO';2 3
行号 INDEX_NAME TABLE_NAME UNIQUENESS
---------- ------------------- ---------- ----------
1 IDX_DMDEV_DEMO_NAME DMDEV_DEMO NONUNIQUE
2 INDEX33555472 DMDEV_DEMO UNIQUE
3 INDEX33555471 DMDEV_DEMO NONUNIQUE
和恢复之前一样
SQL> DESC DEVDEMO.DMDEV_DEMO;
行号 NAME TYPE$ NULLABLE
---------- -------------- ------------ --------
1 PRODUCE_ORG_ID INTEGER N
2 ID INTEGER Y
3 NAME VARCHAR(50) N
4 AGE INTEGER Y
5 EMAIL VARCHAR(100) Y
6 CREATE_TIME DATETIME(6) Y
7 STATUS CHAR(1) Y
8 SALARY DEC(10, 2) Y
9 REMARK TEXT Y
9 rows got
已用时间: 143.510(毫秒). 执行号:1404.
和恢复之前一样
disql SYSDBA/******@192.168.1.2:5239
SQL> select count(*) from DEVDEMO.DMDEV_DEMO;
行号 COUNT(*)
---------- --------------------
1 20
已用时间: 4.518(毫秒). 执行号:802.
和恢复之前一样
SQL> select * from DEVDEMO.DMDEV_DEMO where id>11;
行号 PRODUCE_ORG_ID ID NAME AGE EMAIL CREATE_TIME STATUS SALARY REMARK
---------- -------------- ----------- ------ ----------- ----------------- -------------------------- ------ ------- ---------------
1 1012 12 褚四 28 chusi@demo.com 2025-12-04 16:06:25.000000 A 10500 Java开发
2 1013 13 卫五 29 weiwu@demo.com 2025-12-04 16:06:25.000000 A 10800.5 Python工程师
3 1014 14 蒋六 36 jiangliu@demo.com 2025-12-04 16:06:25.000000 A 19000 首席技术官
4 1015 15 沈七 27 shenqi@demo.com 2025-12-04 16:06:25.000000 A 9200 初级开发
5 1016 16 韩八 32 hanba@demo.com 2025-12-04 16:06:25.000000 A 12000 全栈工程师
6 1017 17 杨九 30 yangjiu@demo.com 2025-12-04 16:06:25.000000 I 10000 已调岗
7 1018 18 朱十 26 zhushi@demo.com 2025-12-04 16:06:25.000000 A 8900.75 大数据开发
8 1019 19 秦一 31 qinyi@demo.com 2025-12-04 16:06:25.000000 A 11500 安全工程师
9 1020 20 尤二 28 youer@demo.com 2025-12-04 16:06:25.000000 A 9700.25 算法工程师
和恢复之前一样
四. 总结与注意事项
通过以上完整步骤,成功将GBK字符集数据库中的数据迁移至UTF-8字符集数据库,验证了逻辑备份与还原方法的有效性。关键注意事项包括:在逻辑恢复之前,必须在UTF-8数据库中预先创建与源库一致的表空间、用户及权限。本案例为保持环境一致性,完整还原了用户与权限。建议在实际迁移前,充分规划数据库实例的各项参数,包括实例名称、数据库名称、端口号、字符集、页大小、簇大小、大小写敏感设置及联机日志大小等,以确保迁移过程顺利并避免后续兼容性问题。
文章
阅读量
获赞
