expdp 字符集从ZHS16GBK到AL32UTF8

       源oracle数据库是GBK字符集,目标库是UTF8字符集,现在需要将源库的一个表空间数据导入到目标库。我的解决方法有点繁琐,首先直接导出源库的表空间

1
expdp trmuser/trmpass schemas=trmuser DIRECTORY=ORACLEDMP dumpfile=trmpass-$(date +%Y%m%d).dmp;

  然后在目标库导入表空间

1
impdp trmuser/trmpass remap_schema=trmuser:trmuser remap_tablespace=trm_data:trm_data DIRECTORY=ORACLEDMP dumpfile=trmpass-20190109.dmp table_exists_ac<br>tion=replace parallel=4 logfile=trmuser.log

  导入后查看错误日志trmuser.log,然后执行程序,生成源库所要扩字段的SQL语句。

  TableObject.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.efounder.sdu.test;
 
public class TableObject {
    // 表名
    String tableName;
    // 字段名
    String columnName;
 
    // 原先最大值
    Integer oldMaxSize;
    // 现最大值
    Integer maxSize;
    Integer lineNum;
    // 修改字段的sql
    String sql;
 
    public Integer getLineNum() {
        return lineNum;
    }
 
    public void setLineNum(Integer lineNum) {
        this.lineNum = lineNum;
    }
 
    public String getSql() {
        return sql;
    }
 
    public void setSql(String sql) {
        this.sql = sql;
    }
 
    public String getTableName() {
        return tableName;
    }
 
    public void setTableName(String tableName) {
        this.tableName = tableName;
    }
 
    public String getColumnName() {
        return columnName;
    }
 
    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }
 
    public Integer getMaxSize() {
        return maxSize;
    }
 
    public void setMaxSize(Integer maxSize) {
        this.maxSize = maxSize;
    }
 
    public Integer getOldMaxSize() {
        return oldMaxSize;
    }
 
    public void setOldMaxSize(Integer oldMaxSize) {
        this.oldMaxSize = oldMaxSize;
    }
}

  CWZTTest4.java(根据自己用户表空间信息进行修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package com.efounder.sdu.test;
 
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
 
/**
 * todo
 *
 * @author wangxin
 * @version 2018/12/22 22:34
 */
public class CWZTTest4 {
 
 
    public static String SPACE = " ";
 
    public static void main(String[] args) throws Exception {
        String format = "yyyy-MM-dd HHmm";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
 
        Long time = System.currentTimeMillis();
        String timeSuffix = "————" + sdf.format(new Date(Long.valueOf(time)));
 
        String localFilePath = "D:\\ChangeColumnLengthSql\\";
        // CHANGE ME-1
        String logName = "trm_impdp_20181223";
        String logFileName = localFilePath + logName + ".log";
        String outputFileName = localFilePath + logName + timeSuffix + ".txt";
 
        // CHANGE ME-2
        String oldUsername = "trmuser";
        // CHANGE ME-3
        String newUsername = "trmuser";
 
        String oldTablespaceName = "trm_data";
        String newTablespaceName = "trm_data";
        String newDirectory = "trm_dir";
 
 
        System.out.println(outputFileName);
        analyseLog(logFileName, outputFileName, oldUsername, newUsername, oldTablespaceName, newTablespaceName, newDirectory);
    }
 
 
    private static void analyseLog(String logFileName, String outputFileName, String oldUsername, String newUsername, String oldTablespaceName, String newTablespaceName, String newDirectory) throws Exception {
//        String path = "F:\\gateway\\gateway_impdp_20181225.log";
        String path = logFileName;
 
        File file = new File(path);
        InputStreamReader reader = new InputStreamReader(
                new FileInputStream(file));
        BufferedReader br = new BufferedReader(reader);
        String line = "";
        line = br.readLine();
 
        Map<String, TableObject> map = new LinkedHashMap<>();
 
        while (line != null) {
            String tableNameLine = "";
            String columnAndSizeLine = "";
            if (line.indexOf("ORA-02374") >= 0) {
                tableNameLine = line;
                line = br.readLine();
                columnAndSizeLine = line;
                String tableName = tableNameLine.split("\"")[3];
                String[] columnSize = columnAndSizeLine.split("ORA-12899: value too large for column |[ (]|maximum: |[)]");
                String columnName = columnSize[1];
                String oldMaxSzieStr = columnSize[6];
                Integer maxSize = Integer.parseInt(oldMaxSzieStr) * 2;
 
 
                String sql = "";
                sql += "ALTER TABLE " + tableName + " MODIFY (" + columnName + " VARCHAR2(" + maxSize + "));\r\n";
                sql += "UPDATE SYS_OBJCOLS SET COL_LEN = '" + maxSize + "' WHERE OBJ_ID = '" + tableName + "' AND COL_ID ='" + columnName + "';\r\n";
                sql += "\r\n";
 
                TableObject tableObject = new TableObject();
                tableObject.setTableName(tableName);
                tableObject.setColumnName(columnName);
                tableObject.setMaxSize(maxSize);
                tableObject.setSql(sql);
 
                map.put(tableName + "-" + columnName, tableObject);
            }
            line = br.readLine();
        }
 
        File outputFile = new File(outputFileName);
 
        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputFile));
        BufferedWriter bufferedWriter = new BufferedWriter(writer);
 
        for (TableObject to : map.values()) {
            bufferedWriter.write(to.getSql());
        }
 
        bufferedWriter.close();
 
        Set<String> set = map.keySet();
 
        StringBuilder sb = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
 
        List<String> tableList = new ArrayList<>();
        for (String s : set) {
            String table = s.split("-")[0];
            tableList.add(table);
            sb.append(table);
            sb.append(",");
            sb2.append(oldUsername + "." + table);
            sb2.append(",");
        }
 
        String sqlStr = sb.toString();
        sqlStr = sqlStr.substring(0, sqlStr.length() - 1);
 
        String sqlStr2 = sb2.toString();
        sqlStr2 = sqlStr2.substring(0, sqlStr2.length() - 1);
 
        String expdp = "expdp " + oldUsername + "/zjtest TABLES=" +
                sqlStr +
                SPACE +
                "DIRECTORY=ORACLEDMP" +
                SPACE +
                "dumpfile=" + newUsername + "_uat_expdp_tableadd.dmp" +
                SPACE +
                "logfile=" + newUsername + "_expdp_tableadd.log";
 
        System.out.println(expdp + "\r\n");
 
        String impdp = "impdp " + newUsername + "/pansoft2019 TABLES=" +
                sqlStr2 +
                SPACE +
                "remap_schema=" + oldUsername + ":" + newUsername +
                SPACE +
                "remap_tablespace=" + oldTablespaceName + ":" + newTablespaceName +
                SPACE +
                "DIRECTORY=" + newDirectory + "" +
                SPACE +
                "dumpfile=" + newUsername + "_uat_expdp_tableadd.dmp" +
                SPACE +
                "table_exists_action=replace" +
                SPACE +
                "logfile=" + newUsername + "_expdp_tableadd.log";
 
        System.out.println(impdp);
    }
}

  生成扩充字段SQL语句示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
ALTER TABLE ZJ_JYMX MODIFY (F_FX VARCHAR2(4));
UPDATE SYS_OBJCOLS SET COL_LEN = '4' WHERE OBJ_ID = 'ZJ_JYMX' AND COL_ID ='F_FX';
 
ALTER TABLE ZJ_JYMX MODIFY (F_DFDW VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_JYMX' AND COL_ID ='F_DFDW';
 
ALTER TABLE ZJ_NBCDYWXX MODIFY (F_DFDW VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_NBCDYWXX' AND COL_ID ='F_DFDW';
 
ALTER TABLE ZJ_DBXX MODIFY (F_YHMC VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_DBXX' AND COL_ID ='F_YHMC';
 
ALTER TABLE ZJ_DBYWXX MODIFY (F_YHMC VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_DBYWXX' AND COL_ID ='F_YHMC';
 
ALTER TABLE ZJ_HSZHZL MODIFY (F_FKZY VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_HSZHZL' AND COL_ID ='F_FKZY';
 
ALTER TABLE ZJ_NBCDFDLL MODIFY (F_SJDW VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_NBCDFDLL' AND COL_ID ='F_SJDW';
 
ALTER TABLE ZJ_NBDCZQ MODIFY (F_SJDW VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_NBDCZQ' AND COL_ID ='F_SJDW';
 
ALTER TABLE ZJ_PJSQXX MODIFY (F_CPRZH_YH VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_PJSQXX' AND COL_ID ='F_CPRZH_YH';
 
ALTER TABLE ZJ_SXFL MODIFY (F_SXHT VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_SXFL' AND COL_ID ='F_SXHT';
 
ALTER TABLE ZJ_SXHTFS MODIFY (F_HTBH VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_SXHTFS' AND COL_ID ='F_HTBH';
 
ALTER TABLE ZJ_SXHTPZ MODIFY (F_HTBH VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_SXHTPZ' AND COL_ID ='F_HTBH';
 
ALTER TABLE ZJ_SXYWXX MODIFY (F_DWMC VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_SXYWXX' AND COL_ID ='F_DWMC';
 
ALTER TABLE ZJ_SXYWXX MODIFY (F_JGMC VARCHAR2(120));
UPDATE SYS_OBJCOLS SET COL_LEN = '120' WHERE OBJ_ID = 'ZJ_SXYWXX' AND COL_ID ='F_JGMC';
 
ALTER TABLE ZJ_TZHEAD MODIFY (F_XMMC VARCHAR2(100));
UPDATE SYS_OBJCOLS SET COL_LEN = '100' WHERE OBJ_ID = 'ZJ_TZHEAD' AND COL_ID ='F_XMMC';
 
ALTER TABLE ZJ_BHSQXX MODIFY (F_KZYHFHMC VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_BHSQXX' AND COL_ID ='F_KZYHFHMC';
 
ALTER TABLE ZJ_BHSQXX MODIFY (F_SYRMC VARCHAR2(80));
UPDATE SYS_OBJCOLS SET COL_LEN = '80' WHERE OBJ_ID = 'ZJ_BHSQXX' AND COL_ID ='F_SYRMC';
 
ALTER TABLE ZJ_FKZLB MODIFY (F_FK_ZHMC VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_FKZLB' AND COL_ID ='F_FK_ZHMC';
 
ALTER TABLE BIZ_MONITOR MODIFY (F_LXMC VARCHAR2(120));
UPDATE SYS_OBJCOLS SET COL_LEN = '120' WHERE OBJ_ID = 'BIZ_MONITOR' AND COL_ID ='F_LXMC';
 
ALTER TABLE MDM_ITEM MODIFY (F_CHAR6 VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'MDM_ITEM' AND COL_ID ='F_CHAR6';
 
ALTER TABLE ZJ_BHYWXX MODIFY (F_SQSY VARCHAR2(2000));
UPDATE SYS_OBJCOLS SET COL_LEN = '2000' WHERE OBJ_ID = 'ZJ_BHYWXX' AND COL_ID ='F_SQSY';
 
ALTER TABLE ZJ_JNJSXX MODIFY (F_FK_JGMC VARCHAR2(120));
UPDATE SYS_OBJCOLS SET COL_LEN = '120' WHERE OBJ_ID = 'ZJ_JNJSXX' AND COL_ID ='F_FK_JGMC';
 
ALTER TABLE ZJ_NBCDXX MODIFY (F_SJDW VARCHAR2(60));
UPDATE SYS_OBJCOLS SET COL_LEN = '60' WHERE OBJ_ID = 'ZJ_NBCDXX' AND COL_ID ='F_SJDW';

  然后在源库执行SQL语句进行扩充字段

1
sqlplus trmuser/trmpass@10.20.31.201:1521/orcl

  在源库扩充完字段后重新导出数据,然后我选择最直接的方法目标库直接重建表空间然后重新导入,字符不一致问题解决。

 

posted @   人艰不拆_zmc  阅读(2908)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2017-01-10 更换CentOS7的下载源为阿里云
点击右上角即可分享
微信分享提示