之前接触的项目表空间最大也不超过 10G,所以导入数据库时一直使用导入本地的 oracle 数据库文件的方法,即根据 dmp 文件大小设置一个数据文件,设定表空间最大值。
— 创建表空间, 数据文件为’F:\app\zang\oradata\orcl\charge_zang.dbf’,初始大小 50M,递增 10M,最大递增到 2G
create tablespace charge_zang datafile ‘F:\app\zang\oradata\orcl\charge_zang.dbf’ size 50M
autoextend on next 10M
maxsize 2048M;
生产环境考虑到数据库可能一直增加信息,所以放开表空间大小限制,语句如下:
— 改变用户表空间容量限制,不做限制
ALTER USER ankangreli QUOTA UNLIMITED ON ankangrelir_data;
但是今天开会讨论了一个问题,公司接手了一个项目,新客户原先使用的系统,数据库大小有 2T,现在需要对他的数据库信息进行整理和迁移,首先的步骤是把客户的数据库导入我们的服务器,为此公司特地买了块 8T 的外接硬盘(不到 2000 块!),这按我之前的方法导入,即使放开容量限制,也会到达 oracle 的容量限制,因此需要换种方法来导入。
导入之前了解一些概念:
表空间数据文件容量与 DB_BLOCK_SIZE 有关,在初始建库时,DB_BLOCK_SIZE 要根据实际需要,设置为 4K、8K、16K、32K、64K 等几种大小,ORACLE 的物理文件最大只允许 4194304 个数据块(由操作系统决定),表空间数据文件的最大值为 4194304×DB_BLOCK_SIZE/1024M。
sql 查看 DB_BLOCK_SIZE 值
查看 INITIAL_EXTENT 值是 DB_BLOCK_SIZE 的整数倍
截取的更多 DB_BLOCK_SIZE 作用如下:【来源】
- DB_BLOCK_SIZE 作为数据库的最小操作单位,是在创建数据库的时候指定的,在创建完数据库之后便不可修改。要修改 DB_BLOCK_SIZE,需要重建数据库。一般可以将数据 EXP 出来,然后重建数据库,指定新的 DB_BLOCK_SIZE,然后再将数据 IMP 进数据库。
- DB_BLOCK_SIZE 一般设置为操作系统块的倍数,即 2K,4K,8K,16K 或 32K,但它的大小一般受数据库用途的影响。对于联机事务,其特点是事务量大,但每个事务处理的数据量小,所以 DB_BLOCK_SIZE 设置小点就足够了,一般为 4K 或者 8K,设置太大话一次读出的数据有部分是没用的,会拖慢数据库的读写时间,同时增加无必要的 IO 操作。而对于数据仓库和 ERP 方面的应用,每个事务处理的数据量很大,所以 DB_BLOCK_SIZE 一般设置得比较大,一般为 8K,16K 或者 32K,此时如果 DB_BLOCK_SIZE 小的话,那么 I/O 自然就多,消耗太大。
- 大一点的 DB_BLOCK_SIZE 对索引的性能有一定的提高。因为 DB_BLOCK_SIZE 比较大的话,一个 DB_BLOCK 一次能够索引的行数就比较多。
- 对于行比较大的话,比如一个 DB_BLOCK 放不下一行,数据库在读取数据的时候就需要进行行链接,从而影响读取性能。此时 DB_BLOCK_SIZE 大一点的话就可以避免这种情况的发生。
回到该问题,通过上面的信息我们得出:在本机单个表空间文件大小超过 32G 时,表空间容量就达到了最大值,数据库就不能继续增加信息了,那么该采取什么措施呢?
1. 多个数据文件累加
将表空间存储为多个数据文件,每个文件不大于 32GB(精确的值为 32768M)
语法如下:(不够的话继续添加数据文件)
create tablespace JC_DATA
logging
datafile ‘F:\app\oracle\oradata\orcl\JC_DATA01.dbf’ size 50m
autoextend on
next 50m maxsize 32767m
extent management local; — 为表空间增加数据文件
alter tablespace JC_DATA add datafile ‘F:\app\oracle\oradata\orcl\JC_DATA02.dbf’ size 50m
autoextend on next 50m maxsize 32767m;
2. 扩大 db_block_size
根据 oracle 的算法,我们很容易想到这个解决方法。数目衡定,但是 db_block_size 可以更改(db_block_size 的最大大小为 32KB)。如果把 db_block_size 扩大到 32KB,那么我们的系统就可以支持单个数据文件最大 128GB。
这个方案听起来好像很迷人,但是实际上并不是那么回事。因为要修改 db_block_size 并不是很容易的事。因为这个 db_block_size 在创建实例的时候就要指定。而且不能通过简单修改参数来指定 db_block_size。db_block_size 的默认值为 8192 bytes,是不能被用户修改的。因为 db_block_size 对应于一个实例,所以意味着在数据库创建(建库)以后是不能修改的,如需修改,可行的方式是重新建库并把原库的数据 export 到新库。当然最好的方式是在建数据库之前就规划好,一般如果是 OLTP 系统,可以保持默认值;OLAP 环境可以考虑适当调大。
3. 创建 bigfile 表空间
在 oracle11g 中引进了 bigfile 表空间,他充分利用了 64 位 CPU 的寻址能力,使 oracle 可以管理的数据文件总量达到 8EB。单个数据文件的大小达到 128TB,即使默认 8K 的 db_block_size 也达到了 32TB。
创建 bigfile 的表空间使用的 sql 语句和创建表空间的语句使用基本相同。
create bigfile tablespace···
需要注意的是使用 bigfile 表空间,它只能支持一个数据文件。也就是说这个文件的最大大小就是表空间最大大小,你不可能通过增加数据文件来扩大该表空间的大小。
参考:
http://blog.sina.com.cn/s/blog_4b1c9e12010006vj.html
https://www.cnblogs.com/gavanwanggw/p/6714388.html
https://blog.csdn.net/zhangzheng0413/article/details/8271322
https://www.cnblogs.com/zjfjava/p/9556311.html