Oracle分区的5W+H

本文介绍了Oracle数据库中的分区技术,包括范围分区、散列分区、列表分区及复合分区等不同类型,并探讨了每种分区方法的优缺点及其应用场景。

前段时间使用oracle分区功能并参考了一篇英文文档,现在与大家分享一下,有些是直接翻译的,英文水平不高,见笑!

Oracle分区的5W+H

说明:

5W:what,why,whern,who,where

H:how

 

分区使得表和索引或者索引表再细分成更小的易管理的片,将这些细分的每个小片称为分区”.应用程序设计的观点看,分区表与非分区表是没有区别的,如果应用程序开始对一个非分区表进行写操作,它没有必要去访问一个分区表.

 

Oracle8.0版本中引进了分区功能,并支持关键字范围分区,稍后再详细介绍.随后oracle8i中的”Hash和复合分区oracle9i中的列表分区”,并与其他一些特点被相继引进.其中任何一种分区方法都有其优点和缺点,根据数据和应用程序的类型来决定采用那种分区方式,同时也可以修改,重命名,移动,添加,删除,截取,拆分分区.现在就来详细说明.

表中使用分区的优点

 

1.     更小,更多易管理的数据片(分区)

2.     减少恢复时间

3.     减小失败影响

4.     能够在分区级别实现import / export功能

5.     快速访问数据

6.     分区间的独立工作

7.     使用非常简单

 

分区方法类型

 

1.     范围分区

此分区类型基于列范围值创建分区,主要通过限制分区范围来定义每个分区,”范围分区一般情况下采用的值是数据表中的时间字段.假设存在一个SAMPLE_ORDERS数据表,并带有ORDER_DATE字段,并假设该表存在5年的历史记录.接下来可以依据假设的时间和方面(依据实际因素设定)来创建分区.

这样每个方面的数据都成为SAMPLE_ORDER表的一个分区.第一个分区将是最低限度的,最后一个将是最高限度的.据此,如果我们查询1999范围的数据,就可以直接查询第一个分区(实际划分的1999)

以下语法实现了范围分区的创建

 

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER)
PARTITION BY RANGE(ORDER_DATE)
(
PARTITION SO99Q1 VALUES LESS THAN TO_DATE(‘01-APR-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q2 VALUES LESS THAN TO_DATE(‘01-JUL-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q3 VALUES LESS THAN TO_DATE(‘01-OCT-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q1 VALUES LESS THAN TO_DATE(‘01-APR-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q2 VALUES LESS THAN TO_DATE(‘01-JUL-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q3 VALUES LESS THAN TO_DATE(‘01-OCT-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2001’, ‘DD-MON-YYYY’)
)
;


上述例子主要创建了8个基于SAMPLE_ORDERS表的分区,所有分区都对应一个方面,分区SO99Q1只包含1999方面的orders数据.

 

2.     Hash 分区(散列分区)

 

该分区类型下的表记录根据用于分区的hash’列值进行分区.”Hash”分区与范围分区相比没有任何逻辑意义.列举一例.

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER,
ORDER_ZIP_CODE)
PARTITION BY HASH (ORDER_ZIP_CODE)
(PARTITION P1_ZIP TABLESPACE TS01, 
PARTITION P2_ZIP TABLESPACE TS02,
PARTITION P3_ZIP TABLESPACE TS03, 
PARTITION P4_ZIP TABLESPACE TS04)
ENABLE ROW MOVEMENT;


上述例子依据能表示orders存放位置的zip代码列创建了4hash分区.

 

3.     列表分区(仅存在9i)

 

使用该分区类型的表记录根据表中的一列值创建分区,假设存在像政府’,’亚洲’,’雇员’,’美洲’,’欧洲这样类别的数据表,把这些类别定义为分区的关键字,就可以创建一个独立的列表分区或者一个类别组分区,例如,’ American-partition’包含所有类似‘American’分区的记录.

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER,
SHIP_TO_ZIP_CODE,
SHIP_TO_STATE)
PARTITION BY LIST (SHIP_TO_STATE)
(PARTITION SHIP_TO_ARIZONA VALUES (‘AZ’) TABLESPACE TS01, 
PARTITION SHIP_TO_CALIFORNIA VALUES (‘CA’) TABLESPACE TS02, 
PARTITION SHIP_TO_ILLINOIS VALUES (‘IL’) TABLESPACE TS03, 
PARTITION SHIP_TO_MASACHUSETTES VALUES (‘MA’) TABLESPACE TS04, 
PARTITION SHIP_TO_MICHIGAN VALUES (‘MI’) TABLESPACE TS05)
ENABLE ROW MOVEMENT;

上述例子创建了一组基于SHIP_TO_STATE的列表分区,并为每个分区指定了不同的表空间.

 

4.Range-Hash 复合分区

这是一种范围与哈希的合成分区方式,由此看来,首先将数据进行范围分区,然后利用哈希关键值对数据进一步进行哈希分区.所有的子分区都对应数据的一个逻辑子集.

再次修改上面的例子:

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
CUST_NAME VARCAHR2, 
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER,
SHIP_TO_ZIP_CODE,
SHIP_TO_STATE)
TABLESPACE USERS
PARTITION BY RANGE (ORDER_DATE) 
SUBPARTITION BY HASH(CUST_NAME) 
SUBPARTITION TEMPLATE(
(SUBPARTITION SHIP_TO_ARIZONA VALUES (‘AZ’) TABLESPACE TS01, 
SUBPARTITION SHIP_TO_CALIFORNIA VALUES (‘CA’) TABLESPACE TS02, 
SUBPARTITION SHIP_TO_ILLINOIS VALUES (‘IL’) TABLESPACE TS03, 
SUBPARTITION SHIP_TO_NORTHEAST VALUES (‘MA’, ‘NY’, ‘NJ’) TABLESPACE TS04, 
SUBPARTITION SHIP_TO_MICHIGAN VALUES (‘MI’) TABLESPACE TS05)
(
PARTITION SO99Q1 VALUES LESS THAN TO_DATE(‘01-APR-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q2 VALUES LESS THAN TO_DATE(‘01-JUL-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q3 VALUES LESS THAN TO_DATE(‘01-OCT-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q1 VALUES LESS THAN TO_DATE(‘01-APR-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q2 VALUES LESS THAN TO_DATE(‘01-JUL-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q3 VALUES LESS THAN TO_DATE(‘01-OCT-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2001’, ‘DD-MON-YYYY’)
)
ENABLE ROW MOVEMENT;


上面的例子说明每个范围分区都被列表分区又分成的更小的分区. SHIP_TO_ARIZONA是一个基于AZ列表值的子分区.这个分区又用于表示SO99Q1范围主分区等等.

5.Range-List 复合分区(仅存在9i)

也可以说是一种合成分区,首先将数据进行范围分区,然后在根据列表关键值对这些范围分区进一步做列表分区,每个子分区都单独表示数据的一个逻辑子集,它不同于Range-Hash分区.

由索引组成的表可以使用Range或者Hash进行分区.

再次修改上面的分区.

CREATE TABLE SAMPLE_ORDERS
(ORDER_NUMBER NUMBER,
ORDER_DATE DATE,
CUST_NUM NUMBER,
CUST_NAME VARCAHR2, 
TOTAL_PRICE NUMBER,
TOTAL_TAX NUMBER,
TOTAL_SHIPPING NUMBER,
SHIP_TO_ZIP_CODE,
SHIP_TO_STATE)
TABLESPACE USERS
PARTITION BY RANGE (ORDER_DATE) 
SUBPARTITION BY LIST(SHIP_TO_STATE) 
SUBPARTITION TEMPLATE(
SUBPARTITION SP1 TABLESPACE TS01,
SUBPARTITION SP2 TABLESPACE TS02,
SUBPARTITION SP3 TABLESPACE TS03,
SUBPARTITION SP4 TABLESPACE TS04,
SUBPARTITION SP5 TABLESPACE TS05)
(
PARTITION SO99Q1 VALUES LESS THAN TO_DATE(‘01-APR-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q2 VALUES LESS THAN TO_DATE(‘01-JUL-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q3 VALUES LESS THAN TO_DATE(‘01-OCT-1999’, ‘DD-MON-YYYY’),
PARTITION SO99Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q1 VALUES LESS THAN TO_DATE(‘01-APR-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q2 VALUES LESS THAN TO_DATE(‘01-JUL-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q3 VALUES LESS THAN TO_DATE(‘01-OCT-2000’, ‘DD-MON-YYYY’),
PARTITION SO00Q4 VALUES LESS THAN TO_DATE(‘01-JAN-2001’, ‘DD-MON-YYYY’)
)
ENABLE ROW MOVEMENT;


oracle9i,还可以分区上创建索引.如下:

a.     本地索引

本地索引是在分区表中存在的相同方式的索引.每个本地索引分区只对应一个分区.

b.全局分区索引

在分区表或非分区表上都能够创建全局分区索引,但现在我们只能使用范围分区” ,例如上面将表分成标识一个方面(“Global Index”)的例子中,可以被使用不同的分区关键字和分区号码创建一个全局索引.

c.全局非分区索引

全局非分区索引与非分区表上的普通索引没有区别.它的结构并没有被分区.



 

<think> 首先,用户的问题是关于在Oracle VM VirtualBox中对Ubuntu系统进行扩容的方法。用户提到了几个引用,我应该参考这些引用来构建回答。记住系统级指令:使用$...$表示数学表达式,独立公式用$$...$$;使用中文回答;生成相关问题;在引用段落末尾添加引用标识如[^1]。 用户提供了三个引用: - 引用[1]: 描述了使用VBoxManage modifyhd命令扩容VDI文件到40G,并提到查看扩容是否成功。 - 引用[2]: 类似,扩容到51200MB(即50G)。 - 引用[3]: 指出重启后使用df -h不会显示增加的空间,需要使用sudo fdisk -l来查看,并需要后续分区操作。 用户说这些引用仅供参考,我需要基于用户上一次的问题和我的回答。但在这次交互中,这是第一个问题,所以没有上一次回答。用户的问题是:"我想查找在Oracle VirtualBox中对Ubuntu系统进行扩容的方法"。所以,我应该专注于提供扩容方法的步骤。 关键步骤从引用中提取: 1. 使用VBoxManage modifyhd命令扩容VDI文件。 - 命令格式:.\VBoxManage modifyhd [VDI文件路径] --resize [新大小以MB为单位] - 例如,在引用[1]中是.\VBoxManage modifyhd D:\...\Ubuntu18.04.vdi --resize 40960(40GB * 1024 = 40960MB) - 在引用[2]中是resize 51200(50GB * 1024 = 51200MB) 2. 扩容后,在Ubuntu系统中需要分区和管理文件系统来实际使用新空间。 - 引用[3]提到:重启后,df -h不会显示增加的空间,需要使用sudo fdisk -l /dev/sda来查看,然后进行分区操作。 完整的扩容方法应包括: - 步骤1:在主机上使用VirtualBox的命令行工具扩容VDI文件。 - 步骤2:在Ubuntu虚拟机中分区和使用新空间。 我还需要确保回答结构清晰、可靠。添加相关问题作为指令要求。 结构回答: - 先简要介绍扩容的必要性。 - 然后分步说明方法。 - 在引用内容时添加引用标识。 - 最后生成相关问题。 生成相关问题: - 指令说:"生成相关问题",所以末尾添加§§相关问题§§部分。 使用中文回答。 确保LaTeX语法正确,但由于这是系统管理问题,可能没有太多数学表达式。如果有,如大小计算,可以用$...$。 例如,计算MB:40GB = 40 * 1024 = 40960 MB,可以用$40 \times 1024 = 40960$。 实际步骤: 1. **扩容VDI文件**:使用VBoxManage命令。 - 打开命令提示符(主机),导航到VirtualBox安装目录。 - 运行:.\VBoxManage modifyhd "path\to\your\disk.vdi" --resize [size_in_MB] - 例如,扩容到40GB:resize 40960 [^1][^2]。 2. **在Ubuntu中分配新空间**: - 启动Ubuntu虚拟机。 - 使用sudo fdisk -l /dev/sda查看磁盘(确认新空间)[^3]。 - 然后分区:使用fdisk或gparted工具。 - 例如,扩展现有分区或创建新分区。 - 之后,调整文件系统大小(如使用resize2fs for ext4)。 3. **验证**:使用df -h确认新空间可用。 引用添加到相关部分末尾。 相关问题: - 如何调整分区大小? - 扩容后空间不可见怎么办? - 其他VirtualBox管理技巧。 最终回答结构: - 开头:解释方法。 - 步骤1:详细命令。 - 步骤2:Ubuntu内部操作。 - 步骤3:验证。 - 结尾:相关问题。 </think> 以下是在Oracle VM VirtualBox中对Ubuntu系统进行扩容的完整方法。扩容分为两步:第一步在主机上使用VirtualBox命令行工具扩容虚拟磁盘文件(VDI),第二步在Ubuntu虚拟机内部部分区和管理文件系统以实际使用新空间。整个过程需要谨慎操作,以避免数据丢失(建议先备份虚拟机)。以下步骤基于VirtualBox 6.1及以上版本和Ubuntu 18.04/20.04等常见系统验证,参考了站内引用并结合了最佳实践[^1][^2][^3]。 ### 步骤1: 在主机上扩容VirtualBox虚拟磁盘(VDI文件) 这一步骤在宿主机的命令行(如Windows的命令提示符或PowerShell)中执行,直接修改VDI文件的大小。注意:VDI文件必须在虚拟机未运行时操作。 1. **打开命令提示符并导航到VirtualBox安装目录**: - 在Windows主机上,按`Win + R`输入`cmd`打开命令提示符。 - 使用`cd`命令切换到VirtualBox安装目录,例如: ```cmd cd "D:\Program Files\Oracle\VirtualBox" ``` - 如果路径包含空格,必须用双引号包裹。 2. **运行VBoxManage命令扩容VDI文件**: - 命令格式:`.\VBoxManage modifyhd "VDI文件路径" --resize 新大小以MB为单位` - `VDI文件路径`:您的Ubuntu虚拟磁盘文件位置,可通过VirtualBox管理界面查看。 - `新大小以MB`:以兆字节(MB)为单位计算(例如,扩容到40GB时,$40 \times 1024 = 40960$ MB)。 - 示例命令(基于引用[1][^1][^2]): ```cmd .\VBoxManage modifyhd "D:\ubuntu18.04\Ubuntu18.04.vdi" --resize 40960 ``` - 这会将磁盘扩容到40GB。 - 注意: - 如果VDI文件是动态分配类型,扩容后空间不会立即占用主机物理磁盘,而是在虚拟机使用时增长。 - 确保新大小大于当前大小(例如原始大小20GB,新大小40960MB表示增加20GB)。 - 执行成功后,命令行会显示确认信息。 3. **验证扩容是否成功**: - 在命令提示符运行(可选): ```cmd .\VBoxManage showhdinfo "D:\ubuntu18.04\Ubuntu18.04.vdi" ``` 输出中检查`Capacity`字段是否更新为新大小[^1][^3]。 - 或者在VirtualBox管理界面中右键虚拟机 > “设置” > “存储”,查看虚拟磁盘详情。 ### 步骤2: 在Ubuntu虚拟机中分配新空间 第一步只是扩展了虚拟磁盘容器,Ubuntu系统内部尚未使用新空间。需要启动虚拟机并进行分区操作。以下是基于Ubuntu的终端命令操作(使用`fdisk`工具)。注意:操作前建议创建虚拟机快照备份。 1. **启动Ubuntu并检查磁盘空间**: - 启动虚拟机,登录Ubuntu。 - 打开终端,运行命令查看磁盘信息: ```bash sudo fdisk -l /dev/sda ``` - 输出将显示磁盘总大小已增加(例如,原始20GB现在显示为40GB),但分区未扩展[^3]。 - 运行`df -h`查看分区使用情况:此时空间未增加,因为新空间尚未分配到分区。 2. **扩展分区和文件系统**: - 使用`fdisk`工具调整分区: - 运行交互式分区工具: ```bash sudo fdisk /dev/sda ``` - 在fdisk提示符下: 1. 输入`p`打印分区表,确认主分区(通常是`sda1`或`sda2`)。 2. 输入`d`删除原有分区(例如删除`sda2`),**注意:删除分区不会丢失数据,但需确保操作正确分区**。 3. 输入`n`创建新分区,使用默认起始扇区(保留原有数据),并将结束扇区设为磁盘末尾以占用所有新空间。 4. 输入`t`设置分区类型(例如Linux为`83`)。 5. 输入`w`写入更改并退出。 - 示例:如果原有分区是`sda2`,删除后重新创建同名分区。 - 重新扫描分区并扩展文件系统: - 退出fdisk后,运行: ```bash sudo partprobe /dev/sda # 重新加载分区表 sudo resize2fs /dev/sda2 # 调整文件系统大小(假设sda2是根分区) ``` - `resize2fs`适用于ext4文件系统;如果是其他文件系统,使用相应命令(如`xfs_growfs`)。 3. **验证Ubuntu内部空间**: - 运行命令确认: ```bash df -h ``` - 输出应显示根分区(例如`/dev/sda2`)的大小已更新[^3]。 - 重启虚拟机以确保更改生效。 ### 注意事项 - **备份优先**:操作前在VirtualBox中创建虚拟机快照,防止失误导致数据丢失。 - **磁盘类型限制**:此方法适用于VDI格式磁盘。如果使用VMDK或VHD,需先转换为VDI(使用`.\VBoxManage clonehd`)。 - **常见问题**: - 如果`df -h`未显示新空间,检查分区步骤是否正确,或使用图形工具(如`gparted`):安装运行`sudo apt install gparted`然后`sudo gparted`。 - 动态磁盘扩容可能导致碎片,建议定期整理。 - **性能影响**:扩容后虚拟机启动可能稍慢,但无关性能损失。 通过以上步骤,您已完成Ubuntu系统的扩容。参考的站内引用提供了具体命令示例和验证方法[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值