Archive for 数据库

>Oracle字符集差异导致的问题

>

两个Oracle数据库通过dblink导数据,实用create table ttttt as select * from ttttt@a.oracle.com,发现char(1)在新创建的表中变成了char(3),还好发现的及时,没有导致大的错误。

把char(3)改成varchar2(3),然后批量更新数据。

经检查是字符集导致的问题,字符类型的(char和varchar2)在utf8的数据库上会自动变成gbk的3倍。

教训:不同数据库间导数据需要特别注意字符集差异。

         最重要的是,应用应该尽量避免实用char这个数据类型。

Comments

>Shrinking Database Segments Online 在线收缩数据库段

>

Shrinking Database Segments Online 在线收缩数据库段
两个前提条件:
1.需要收缩的表必须enable row movement;
2.所在表空间必须是assm自动分段空间管理;
具体操作步骤如下:
1.select * from dba_tablespaces 确认表空间是否为assm;
2.alter table TD_EMAILQUEUE enable row movement
该步骤会导致引用此表的对象编译无效,需要重新编译相关代码;
3.ALTER TABLE TD_EMAILQUEUE SHRINK SPACE COMPACT
该步骤实际上是delete和insert的过程,产生Row-X (SX)锁,会造成rowid发生变化,需
要停掉基于rowid的触发器;
这时空间已经回收,但是高水位线并没有改变,这是为了尽可能减低对应用的影响;
4.ALTER TABLE TD_EMAILQUEUE SHRINK SPACE
该步骤修改表的高水位线,在业务不忙的时候执行;
第3和第4可以通过ALTER TABLE TD_EMAILQUEUE SHRINK SPACE一条命令实现

补充:
Shrink a table and all of its dependent segments (including LOB segments):
ALTER TABLE employees SHRINK SPACE CASCADE;

Shrink a LOB segment only:
ALTER TABLE employees MODIFY LOB (perf_review) (SHRINK SPACE);

Comments

>Oracle11g新特性_并行DBMS_PARALLEL_EXECUTE

>

我从Oracle 数据库 11g: 面向 DBA 和开发人员的重要新特性
http://www.oracle.com/technology/global/cn/pub/articles/oracle-database-11g-top-features/index.html
测试了一些个人觉得对日常工作有用的特性进行测试。
需要详细信息请猛击上方链接或者查阅相关文档。

2.并行DBMS_PARALLEL_EXECUTE

  这个新特性引入一个Package:DBMS_PARALLEL_EXECUTE,

  通过这个包可以将一个任务调度为并行,而此前我们需要手工来编写程序,

  通过rowid或者主键还分割,用11gR2,这个工作能简化很多。

  根据测试,oracle是提交job来实现并行,和咱们实现的方式一样。

  官方文档推荐这种做法用作大数据量的更新。

  create table TEMP_ZHJ_20101022 nologging as

    select * from user_objects;

  insert into temp_zhj_20101022 select * from user_objects;

  commit;

  DECLARE

    l_sql_stmt VARCHAR2(1000);

    l_try      NUMBER;

    l_status   NUMBER;

  BEGIN

    — Create the TASK

    dbms_parallel_execute.create_task(‘mytask’);

    — Chunk the table by ROWID

    dbms_parallel_execute.create_chunks_by_rowid(‘mytask’,

                                                 ‘SYS’,

                                                 ‘TEMP_ZHJ_20101022′,

                                                 TRUE,

                                                 100);

    — Execute the DML in parallel

    l_sql_stmt := ‘update /*+ ROWID (dda) */ TEMP_ZHJ_20101022 e

  SET e.EDITION_NAME = ”ORACLE11G”

  WHERE rowid BETWEEN :start_id AND :end_id’;

    dbms_parallel_execute.run_task(‘mytask’,

                                   l_sql_stmt,

                                   dbms_sql.native,

                                   parallel_level => 10);

    — If there is an error, RESUME it for at most 2 times.

    l_try    := 0;

    l_status := dbms_parallel_execute.task_status(‘mytask’);

    WHILE (l_try < 2 AND l_status != dbms_parallel_execute.finished)

    LOOP

      l_try := l_try + 1;

      dbms_parallel_execute.resume_task(‘mytask’);

      l_status := dbms_parallel_execute.task_status(‘mytask’);

    END LOOP;

    — Done with processing; drop the task

    dbms_parallel_execute.drop_task(‘mytask’);

  END;

Comments