1.数据库生僻字改造源数据库业务数据字段调整
1.1.修改需求
随着业务的发展及信息化的应用更加广泛,所存储的文字范围越来越广,目前的很多ZHS16GBK的字符编码的数据库已经不能完全满足信息系统对于信息存储的要求,而急需将现有ZHS16GBK的字符编码的数据库进行改造,改造成可以支持更广泛信息存储的AL32UTF8的字符编码。
针对生僻字的改造的因为是逻辑层面,通常通过逻辑层面解决。
因为业务数据以不同的数据库字符集存储的时候占用空间不一样,同样的业务数据以AL32UTF8字符集存储的时候理论上会比以ZHS16GBK字符集多占用50%空间,我们统一调整源数据库的字符类型字段长度为2000以下的的业务数据为原来的2倍大小,2000以上字段长度统一调整为4000大小。
1.2.修改方法
通过执行脚本一键修改某个用户表字段为CHAR, NCHAR, NVARCHAR2, VARCHAR, VARCHAR2长度为当前长度2倍。
如果字段长度小于2000,则修改为2倍,如果字段长度大于或等于2000,则修改为4000。
1.3.参考脚本
通过数据库业务用户生成修改业务字段的SQL,脚本如下:
user_col_leng_alter.sh
#!/bin/bash
basedir=$(cd $(dirname basename); pwd)
read -p 'Oracle Database user: ' SCHEMA_NAME
read -p 'Oracle Database password: ' PASSWORD
ORACLE_SID=orcl1
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
PATH=$ORACLE_HOME/bin:$PATH
sqltmp1=${basedir}/alter_col_length.tmp
sqltmp2=${basedir}/alter_col_length_2000.tmp
sqlfile1=${basedir}/alter_col_length.sql
sqlfile2=${basedir}/alter_col_length_2000.sql
logfile1=${basedir}/alter_col_length_`date +%Y-%m-%d`.log
logfile2=${basedir}/alter_col_length_2000_`date +%Y-%m-%d`.log
echo > ${sqltmp1}
echo > ${sqltmp2}
echo > ${logfile1}
echo > ${logfile2}
sqlplus -s ${SCHEMA_NAME}/${PASSWORD} <<EOF
set linesize 200
set pagesize 0
spool ${sqltmp1}
select 'alter table ' || table_name || ' modify ' || column_name || ' ' ||
data_type || '(' || data_length * 2 || ') --' || data_type || '(' ||
data_length || ');'
from user_tab_columns
where data_type in ('CHAR', 'NCHAR', 'NVARCHAR2', 'VARCHAR', 'VARCHAR2')
and data_length < 2000
order by table_name, column_name;
spool off
exit
EOF
sleep 1
grep '^alter' ${sqltmp1} > ${sqlfile1}
sqlplus -s ${SCHEMA_NAME}/${PASSWORD} <<EOF
set linesize 200
set pagesize 0
spool ${sqltmp2}
select 'alter table ' || table_name || ' modify ' || column_name || ' ' ||
data_type || '(4000) --' || data_type || '(' || data_length || ');'
from user_tab_columns
where data_type in ('CHAR', 'NCHAR', 'NVARCHAR2', 'VARCHAR', 'VARCHAR2')
and data_length between 2000 and 3999
order by table_name, column_name;
spool off
exit
EOF
sleep 1
grep '^alter' ${sqltmp2} > ${sqlfile2}
echo
echo "Check result file ${sqlfile1}"
echo "Check result file ${sqlfile2}"
echo
sqlplus ${SCHEMA_NAME}/${PASSWORD} <<EOF
set linesize 200
set pagesize 0
set verify on
set echo on
spool ${logfile1}
@${sqlfile1}
spool off
spool ${logfile2}
@${sqlfile2}
spool off
exit
EOF
1.4.脚本使用方法
使用oracle用户执行如下脚本,脚本会提示输入需要修改字段的用户名、密码,输入相应用户、密码。如果有多个用户需要执行多次脚本。如果数据库主机上有多个实例,需注意切换实例名。
sh ./user_col_leng_alter.sh
工作中整理的 侵权删