暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 管理数据库的空间

oracleEDU 2017-10-04
330

Managing Space for the Database

数据库存储

数据库包括物理结构和逻辑结构。由于物理结构和逻辑结构是分开的,因此管理数据的物理存储时不会影响对逻辑存储结构的访问。

磁盘是数据库的主要存储介质,Oracle DB 可以通过特定于平台的设备驱动程序访问硬盘。(数据库写进程 [和 ASM 进程] 可直接向磁盘进行写入,无需通过操作系统。)

Oracle Database 11g 发行版 2 检测磁盘扇区大小并使用高容量磁盘且不会导致性能下降(原因之一是内部优化减少了可能会发生的重做空间浪费,具有许多短时事务处理的应用程序,如邮件系统,可能会发生重做空间浪费)。

建库脚本

先通过如下脚本找trace文件:

SQL> SELECT a.VALUE || b.symbol || c.instance_name || '_ora_' || d.spid || '.trc'

               trace_file

       FROM (SELECT VALUE

               FROM v$parameter

              WHERE name = 'user_dump_dest') a,

            (SELECT SUBSTR (VALUE, -6, 1) symbol

               FROM v$parameter

              WHERE name = 'user_dump_dest') b,

            (SELECT instance_name FROM v$instance) c,

            (SELECT spid

              FROM v$session s, v$process p, v$mystat m

          WHERE s.paddr = p.addr AND s.sid = m.sid AND m.statistic# = 0) d

TRACE_FILE

------------------

/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_18168.trc

将控制文件备份到trace:

SQL> alter database backup controlfile to trace;

Database altered.

找到建库脚本:

vi u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_18168.trc

CREATE CONTROLFILE REUSE DATABASE "ORCL" NORESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 292

LOGFILE

  GROUP 1 (

    '+DATA/orcl/onlinelog/group_1.261.813297219',

    '+FRA/orcl/onlinelog/group_1.257.813297225'

  ) SIZE 50M BLOCKSIZE 512,

  GROUP 2 (

    '+DATA/orcl/onlinelog/group_2.262.813297227',

    '+FRA/orcl/onlinelog/group_2.258.813297235'

  ) SIZE 50M BLOCKSIZE 512,

  GROUP 3 (

    '+DATA/orcl/onlinelog/group_3.263.813297239',

    '+FRA/orcl/onlinelog/group_3.259.813297245'

  ) SIZE 50M BLOCKSIZE 512

指定磁盘扇区大小:

在自动存储管理(ASM) 环境下,你可以为磁盘组设置SECTOR_SIZE属性。该属性只能在创建磁盘组时设置(通过使用CREATE DISKGROUP命令)。

你可以选择在CREATE DATABASE命令中使用BLOCKSIZE子句,如上语句中所示。如果未指定块大小,Oracle DB 将检查底层磁盘扇区大小,并在创建重做日志时使用该磁盘扇区大小作为块大小。因此,默认情况下,重做日志块大小是磁盘扇区大小,而不是之前的512 字节扇区大小。

如果使用的硬件支持4k的扇区,可以指定BLOCKSIZE:

CREATE DATABASE sample NORESETLOGS FORCE LOGGING ARCHIVELOG LOGFILE  GROUP 1 '$ORACLE_BASE/oradata/sample/redo01.log'

              SIZE 100M BLOCKSIZE 4096,

 GROUP 2 '$ORACLE_BASE/oradata/sample/redo02.log‘

              SIZE 100M BLOCKSIZE 4096

DATAFILE

……

在非4KB扇区磁盘创建4KB块大小日志文件报错:

SQL> alter database add logfile group 4 size 51200K blocksize 4096;

alter database add logfile group 4 size 51200K blocksize 4096

*

ERROR at line 1:

ORA-01378: The logical block size (4096) of file +DATA is not compatible with the disk sector size (media sector size is 512 and host sector size is 512)

传输表空间

直接把数据文件拷贝到目标地

例:

在orcl实例有一个表空间tools

$ export ORACLE_SID=orcl

$ sqlplus  / as sysdba

SQL> create tablespace tools datafile '/u01/app/oracle/tools.dbf' size 10M; 

SQL> create table scott.test tablespace tools as select * from scott.emp ;

SQL> select count(*) from scott.test ;

表空间tools迁移到实例ocp上去

方法1:用数据泵导出表空间,再导入

在orcl服务器建立目录对象:

mkdir -p u01/app/oracle/orcl

export ORACLE_SID=orcl

sqlplus  / as sysdba

SQL> create directory d_orcl as  '/u01/app/oracle/orcl';

grant all on directory d_orcl to public;

expdp system/oracle DUMPFILE=tools.dmp  DIRECTORY=d_orcl TABLESPACES=tools

在ocp上:

mkdir -p u01/app/oracle/ocp

export ORACLE_SID=ocp

sqlplus  / as sysdba

create directory d_ocp as  '/u01/app/oracle/ocp';

grant all on directory d_ocp to public;

从orcl上拷贝tools.dmp文件到/u01/app/oracle/ocp

cp u01/app/oracle/orcl/tools.dmp  /u01/app/oracle/ocp

SQL> create tablespace  tools datafile '+data' size 10M ;

$ impdp system/oracle DUMPFILE=tools.dmp  DIRECTORY=d_ocp TABLESPACES=tools

测试:

select count(*) from scott.test ;

方法2:Transporting Tablespaces

直接复制数据文件+导出表空间元数据

主流平台都支持跨平台的表空间传送

COLUMN PLATFORM_NAME FORMAT A36  

SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_NAME;

PLATFORM_ID PLATFORM_NAME            ENDIAN_FORMAT

----------- -------------------------- --------------

          6 AIX-Based Systems (64-bit)           Big

         16 Apple Mac OS                         Big

         21 Apple Mac OS (x86-64)                Little

         19 HP IA Open VMS                       Little

         15 HP Open VMS                          Little

          5 HP Tru64 UNIX                        Little

          3 HP-UX (64-bit)                       Big

          4 HP-UX IA (64-bit)                    Big

         18 IBM Power Based Linux                Big

          9 IBM zSeries Based Linux              Big

         10 Linux IA (32-bit)                    Little

         11 Linux IA (64-bit)                    Little

         13 Linux x86 64-bit                     Little

          7 Microsoft Windows IA (32-bit)        Little

          8 Microsoft Windows IA (64-bit)        Little

         12 Microsoft Windows x86 64-bit         Little

         17 Solaris Operating System (x86)       Little

         20 Solaris Operating System (x86-64)    Little

          1 Solaris[tm] OE (32-bit)              Big

          2 Solaris[tm] OE (64-bit)              Big

1. orcl实例中表空间tools

export ORACLE_SID=orcl

sqlplus as sysdba

create tablespace  tools datafile '/u01/app/oracle/tools.dbf' size 100M;

create table scott.tool tablespace tools as select * from scott.emp;

2. 把orcl下的表空间tools传送到ocp实例(两个库字符集要一样)

select * from database_properties;

在源和目标上都要执行,是否相同的字节:

SQL> SELECT d.PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

PLATFORM_NAME        ENDIAN_FORMAT

---------------- --------------

Linux x86 64-bit              Little

如果源和目标的平台字节一样,不用对数据文件做转换;不一样则需要做转换。

以下是需要转换的例子(源Linux -- 目标AIX-Based Systems (64-bit)):

$ rman target

Recovery Manager: Release 11.2.0.1.0 - Production on Sun Apr 21 10:35:25 2013

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (DBID=1341077951)

RMAN> CONVERT TABLESPACE tools  TO PLATFORM 'AIX-Based Systems (64-bit)'  FORMAT '/tmp/%U';

Starting conversion at source at 21-SEP-17

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: SID=41 device type=DISK

channel ORA_DISK_1: starting datafile conversion

input datafile file number=00006 name=/u01/app/oracle/tools.dbf

converted datafile=/tmp/data_D-ORCL_I-1341077951_TS-TOOLS_FNO-6_03o7kj40

channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:03

Finished conversion at source at 21-SEP-17

3. Pick a Self-Contained Set of Tablespaces(自我包含性检查)

SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('TOOLS', TRUE);

查看结果:

SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;

如:

SQL> create table scott.pdba (id number, time date)

partition by range (time)

(

partition p1 values less than (to_date('2017-8-1', 'yyyy-mm-dd')) tablespace tools ,

partition p2 values less than (to_date('2017-9-1', 'yyyy-mm-dd'))  tablespace example ,

partition p3 values less than (to_date('2017-10-1', 'yyyy-mm-dd')) tablespace users ,

partition p4 values less than (maxvalue) tablespace users

);

SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('TOOLS', TRUE);

SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;

VIOLATIONS

----------

ORA-39921: Default Partition (Table) Tablespace USERS for PDBA not contained in

transportable set.

ORA-39901: Partitioned table SCOTT.PDBA is partially contained in the transporta

ble set.

如果不自我包含 :移动表空间

SQL> alter table scott.pdba move partition p1  tablespace users;

再检查:

EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('TOOLS', TRUE);

SELECT * FROM TRANSPORT_SET_VIOLATIONS;

no rows selected

没有结果, tools自我包含, 可以传送。

4. 产生要传送的文件

    a.先离线要传送的表空间

    ALTER TABLESPACE tools  READ ONLY;

    b.使用data pump 把元数据导出去

        先定义目录对象

        mkdir -p u01/app/oracle/a

        create directory d1 as '/u01/app/oracle/a';

        grant all on directory d1 to public;

        

        expdp system/oracle dumpfile=tools.dmp directory=d1 transport_tablespaces=tools logfile=tts_export.log

        

5. 把数据文件和元数据的dump文件一起拷贝到目标服务器

如果平台一致,不做转换,直接拷贝:

/u01/app/oracle/tools.dbf + tools.dmp 

如果平台不一致,转换,拷贝:

converted datafile=/tmp/data_D-ORCL_I-1341077951_TS-TOOLS_FNO-6_03o7kj40 + tools.dmp

6. 在源数据库orcl把tools表空间设置为读写

$ export ORACLE_SID=orcl

$ sqlplus  / as sysdba

SQL> ALTER TABLESPACE tools  READ write;

7. 在目标数据库ocp加载数据

$ export ORACLE_SID=ocp

$ sqlplus  / as sysdba

show parameter instance;

instance_name                        string      ocp

mkdir u01/app/oracle/ocp 

cp u01/app/oracle/a/tools.dmp u01/app/oracle/ocp

cp /u01/app/oracle/tools.dbf /u01/app/oracle/ocp


创建目录对象

create directory d2 as '/u01/app/oracle/ocp';

grant all on directory d2 to public;


impdp system/oracle dumpfile=tools.dmp directory=d2 transport_datafiles=/u01/app/oracle/ocp/tools.dbf


8. 在目标库ocp上把表空间设置为读写

SQL> ALTER TABLESPACE tools  READ write;

Tablespace altered.


SQL> select count(*) from scott.tool  


  COUNT(*)

----------

        14


直接拷贝了数据文件,速度快。




最后修改时间:2021-04-28 20:12:54
文章转载自oracleEDU,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论