Oracle 解决导表失败
作者: dkvirus 发表于: 2018-06-25 15:41:00 最近更新: 2018-12-14 10:28:48

最近被分配一个迁移表的任务,数据库用的是 Oracle,作为新手的我折腾了几天,跌跌撞撞的踩了些坑(表迁移过程有数据丢失),总算是解决问题。本文记录表迁移及解决表数据丢失问题的过程。

我用的 Oracle 图形化客户端是 PL/SQL Developer,做表导出导入数据还是蛮方便的。

一、表导入导出

1. 工具 > 导出数据

工具>导出/入表

2. 导出表

导出表

这里在第 2 处有两种方式可供选择:

  • Oracle 导出:导出的脚本为 dmp 文件;
  • SQL 插入:导出的脚本为 sql 文件。

二者的区别,我做了个测试,6600 条测试数据,dmp 导出的文件只有 1456kb 大小,而导出的 sql 文件有 3228 kb。dmp 导出文件和导入文件的速度也比 sql 文件快得多。所以我选择的是导出 dmp 文件。

3. 表导入

操作与到导出一样,对话框也类似,这里就不赘述了。

4. 检查数据

表导入之后别以为就结束了,查询数据总条数是否和老表的数据总条数一样,因为我在操作过程中就发现有几张表少了几十条数据。

5. 分析原因

我的数据库字符集是 UTF8,老表的字符集是 GBK16。二者的区别是 UTF8 一个汉字占 3 个字节,GBK16 一个汉字占 2 个字节。

老表有一个字段 address 数据类型为 varchar2(200),存了 100 个汉字。在我的数据库里 100 个汉字要 300 个字节才能存储(字符集是 UTF8,一个汉字占 3 个字节)。所以在导入表时就报了一个错误:数据库表字段最大长度 200,导入数据长度 240

解决方法有两个:

  • 将我数据库表中字段的数据类型调成 varchar2(300),这样也能存储 100 个汉字。
  • 将我数据库字符集换成 GBK16,这样 varchar2(200) 仍然能存储 100 个汉字。

实际操作还是优先换字符集,谁也保不准是否还有其它字段数据类型过短,一个个排查有点麻烦。下面介绍字符集相关东东……

二、修改字符集

1. 查询字符集

报告 > DBA > NLS Database Parameters

第二行 NLS_CHARACTERSET: AL32UTF8 可见这里是 UTF8 编码。

查询字符集

2. 修改字符集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# PL/SQL 新建命令对话框
SQL>sqlplus /nolog
# 在弹出的黑窗口敲下面的命令
SQL>conn / as sysdba
# 若此时数据库服务器已启动,则先执行 SHUTDOWN IMMEDIATE 命令关闭数据库服务器,
# 然后执行以下命令:
SQL>shutdown immediate
SQL>STARTUP MOUNT
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP

修改完成之后再次查看字符集,发现已经更改为 GBK16 了,现在重新导入表数据发现数据全部导进来了~

首页
友链
归档
dkvirus
动态
RSS