【数据库知识】oracle进阶-逻辑结构深入理解
文章目录
- Oracle逻辑结构
- Oracle分区扩展
- 分区对应命令行
- 表空间管理
- 📑 如何备份和恢复Oracle表空间?
- 备份Oracle表空间
- 恢复Oracle表空间
Oracle逻辑结构
Oracle数据库的逻辑结构是层次化的,主要包含以下几个核心组件:
-
数据块(Data Blocks):
- 数据块是Oracle中最小的存储单位,Oracle数据存放在“块”中,通常每个块占用一定的磁盘空间。
- Oracle每次请求数据时,都是以块为单位,如果请求的数据量不到一块,Oracle也会读取整个块。因此,“块”是Oracle读写数据的最小单位。
- 数据块的大小由初始化参数
DB_BLOCK_SIZE
指定,通常为8KB,并且数据块是操作系统块的整数倍 。
-
数据区(Extent):
- 数据区是一组连续的数据块,当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。
- 一个数据区不能跨越多个文件,因为它包含连续的数据块。
- 数据区是保存特定数据类型的数据的单位,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的 。
-
段(Segment):
- 段是由多个数据区构成的,它是为特定的数据库对象(如表段、索引段、回滚段、临时段)分配的一系列数据区。
- 段内包含的数据区可以不连续,并且可以跨越多个文件。
- 使用段的目的是为了保存特定对象。一个Oracle数据库有4种类型的段:数据段、索引段、回滚段、临时段 。
-
表空间(Tablespace):
- 表空间是数据库的逻辑划分,任何数据库对象在存储时都必须存储在某个表空间中。
- 表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。
- 表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。
- 每个数据库至少有一个表空间(system tablespace),表空间的大小等于所有从属于它的数据文件大小的总和 。
这些组件共同构成了Oracle数据库的逻辑结构,它们为数据库中的数据提供了组织和管理的方式。逻辑结构是面向用户的,用户在使用Oracle开发应用程序时,主要通过逻辑结构来操作和访问数据。通过这种层次化的结构,Oracle能够有效地管理大规模的数据,并支持复杂的查询和事务处理 。
Oracle分区扩展
Oracle分区是数据库中一项强大的功能,它允许你将大型的表和索引细分为更小、更易于管理的部分,称为分区。分区可以提高数据库的性能、可管理性和可用性,同时降低成本。以下是Oracle分区的一些关键点和扩展方法:
-
分区方法:
- 范围分区(Range Partitioning):基于连续的值范围进行分区,适合时间序列数据,如按日期进行分区。
- 列表分区(List Partitioning):基于离散的值列表进行分区,适合有限且离散的值,如地区或状态代码。
- 散列分区(Hash Partitioning):使用散列函数将数据均匀分布到各个分区,适合数据分布不均匀的情况。
- 复合分区(Composite Partitioning):结合两种分区方法,如先按范围分区,然后在每个范围内按散列分区。
-
分区扩展:
- 间隔分区(Interval Partitioning):扩展了范围分区,允许自动为将来的分区定义等宽的范围。
- 自动列表分区(Auto-List Partitioning):类似于间隔分区,自动列表分区在插入新的分区键值时自动创建新的列表分区。
- 引用分区(Reference Partitioning):利用现有的父子关系对表进行分区,子表通过外键继承父表的分区策略。
- 基于虚拟列的分区(Virtual Column Based Partitioning):允许使用表达式作为分区键,该表达式使用表中的一个或多个现有列,并且仅存储为元数据。
-
分区表的维护:
- 你可以使用
ALTER TABLE
命令来添加、删除、合并或拆分分区。 - 例如,添加一个新分区的命令如下:
ALTER TABLE your_table_name ADD (PARTITION new_partition_name VALUES LESS THAN (partition_value) ENABLE);
- 动态分区允许根据特定的表达式自动创建分区,这在分区策略不确定时非常有用。
- 你可以使用
-
分区索引:
- 分区索引可以与分区表的分区策略耦合,也可以不耦合。
- 本地索引(Local Indexes)与分区表耦合,每个分区对应于基础表的一个分区。
- 全局索引(Global Indexes)与分区表不耦合,可以使用不同的分区键或分区策略。
-
性能优化:
- 分区可以显著提高查询性能,因为SQL操作只需要处理相关分区的数据。
- 分区修剪(Partition Elimination)是一个提高性能的有效方法,它利用分区元数据仅操作相关数据。
-
可管理性和可用性:
- 分区提高了数据库的可管理性,允许对单个分区执行维护操作,如压缩、备份和恢复。
- 分区提高了数据库的可用性,因为表中的其他分区在某个分区不可用时仍然可用。
通过使用这些分区方法和扩展,你可以更有效地管理和优化大型数据库的性能。Oracle分区是处理大数据和提高数据库性能的重要工具。
分区对应命令行
Oracle分区扩展允许数据库管理员更有效地管理大型表和索引,通过将数据分散到多个分区中来提高查询性能和数据管理的便捷性。以下是Oracle分区的一些关键操作及其命令行示例:
-
添加分区:
- 给定一个已存在的范围分区表,添加一个新分区:
例如,为销售数据表添加一个新分区:ALTER TABLE table_name ADD PARTITION partition_name VALUES LESS THAN (value);
ALTER TABLE sales ADD PARTITION p3 VALUES LESS THAN (TO_DATE('2018-09-01', 'YYYY-MM-DD'));
- 给定一个已存在的范围分区表,添加一个新分区:
-
删除分区:
- 删除一个已有的分区:
例如,删除销售数据表的P3分区:ALTER TABLE table_name DROP PARTITION partition_name;
ALTER TABLE sales DROP PARTITION p3;
- 删除一个已有的分区:
-
截断分区:
- 快速移除分区中的所有行,但不删除分区本身:
ALTER TABLE table_name TRUNCATE PARTITION partition_name;
- 快速移除分区中的所有行,但不删除分区本身:
-
合并分区:
- 将两个或多个相邻的分区合并成一个分区:
例如,合并P1和P2分区到一个新的P12分区:ALTER TABLE table_name MERGE PARTITIONS partition1, partition2 INTO PARTITION new_partition;
ALTER TABLE sales MERGE PARTITIONS p1, p2 INTO PARTITION p12;
- 将两个或多个相邻的分区合并成一个分区:
-
拆分分区:
- 将一个分区拆分为两个新的分区:
例如,将P2分区在2003年2月1日处拆分:ALTER TABLE table_name SPLIT PARTITION partition_name AT (value) INTO (PARTITION partition1, PARTITION partition2);
ALTER TABLE sales SBLIT PARTITION p2 AT (TO_DATE('2003-02-01', 'YYYY-MM-DD')) INTO (PARTITION p21, PARTITION p22);
- 将一个分区拆分为两个新的分区:
-
重命名分区:
- 更改分区的名称:
例如,将P21分区重命名为P2:ALTER TABLE table_name RENAME PARTITION old_partition_name TO new_partition_name;
ALTER TABLE sales RENAME PARTITION p21 TO p2;
- 更改分区的名称:
-
查询分区信息:
- 查询数据库中所有分区表的信息:
SELECT * FROM DBA_PART_TABLES;
- 查询表的分区信息:
SELECT * FROM DBA_TAB_PARTITIONS WHERE TABLE_NAME = 'TABLE_NAME';
- 查询数据库中所有分区表的信息:
-
分区索引:
- 创建分区表时,可以选择创建本地分区索引或全局分区索引。本地分区索引与分区表的结构紧密相关,每个分区有一个索引;全局分区索引则在所有分区上创建同一个索引结构。
以上命令为Oracle数据库中进行分区管理的基本操作。在实际操作中,应根据具体的业务需求和数据访问模式来设计分区策略。
表空间管理
Oracle表空间管理是数据库管理员(DBA)的重要职责之一,它涉及到表空间的创建、监控、调整和优化等多个方面。以下是一些基本的Oracle表空间管理任务和概念:
-
表空间的创建:
表空间是Oracle数据库中用于存储数据的逻辑单元,由一个或多个数据文件组成。创建表空间的命令如下:CREATE TABLESPACE tablespace_name LOGGING DATAFILE 'file_path.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 200M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
这里
tablespace_name
是新创建的表空间名称,file_path.dbf
是数据文件的路径,SIZE
是初始大小,AUTOEXTEND
是自动扩展的设置,EXTENT MANAGEMENT LOCAL
表示数据存储在本地,SEGMENT SPACE MANAGEMENT AUTO
表示自动管理空间。 -
查看表空间信息:
可以使用以下命令来查看表空间的详细信息:SELECT tablespace_name, file_name, bytes/1024/1024 AS size_mb FROM dba_data_files ORDER BY tablespace_name;
这个查询会列出所有表空间及其对应的数据文件和大小。
-
扩展表空间:
如前所述,可以通过添加新的数据文件或增大现有数据文件的大小来扩展表空间。 -
收缩表空间:
如果表空间中有未使用的空间,可以使用ALTER TABLESPACE
命令来收缩表空间:ALTER TABLESPACE tablespace_name RESIZE 90M;
这会将表空间收缩到90MB。
-
监控表空间使用情况:
定期监控表空间的使用情况,以确保数据库性能和避免空间不足的问题。可以使用以下查询来监控:SELECT tablespace_name, round(sum(bytes)/1024/1024, 2) AS total_space_mb, round(sum(bytes - blocks*block_size)/1024/1024, 2) AS used_space_mb, round(sum(blocks*block_size)/1024/1024, 2) AS free_space_mb FROM dba_free_space GROUP BY tablespace_name;
-
删除表空间:
如果不再需要某个表空间,可以使用DROP TABLESPACE
命令来删除它:DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
这会删除表空间及其包含的所有数据和数据文件。
-
表空间的自动扩展:
可以设置表空间的自动扩展属性,以便在空间不足时自动增加数据文件的大小。 -
表空间的维护:
包括碎片整理、空间回收等操作,以保持表空间的效率和性能。 -
权限管理:
控制用户对表空间的访问权限,确保数据的安全性。 -
备份和恢复:
在进行表空间的扩展或收缩操作之前,应该进行备份,以便在出现问题时可以恢复数据。
Oracle表空间管理是一个复杂的过程,需要对Oracle数据库的内部结构和工作原理有深入的了解。DBA应该定期检查表空间的使用情况,并根据需要进行调整,以确保数据库的稳定性和性能。
📑 如何备份和恢复Oracle表空间?
备份和恢复Oracle表空间是数据库管理中的重要任务,以下是一些常用的方法:
备份Oracle表空间
-
使用RMAN进行备份
- 连接到数据库实例:
RMAN> connect target sys/password@database;
- 备份特定表空间:
RMAN> backup tablespace tablespace_name;
- 备份数据库并删除输入(备份后自动删除旧的备份):
RMAN> backup database plus archivelog delete input;
- 增量备份:
RMAN> backup incremental level=0 tablespace tablespace_name plus archivelog delete input;
这些命令可以帮助你备份整个数据库或特定的表空间,包括归档日志。
- 连接到数据库实例:
-
使用ALTER TABLESPACE命令
- 将表空间设置为备份模式:
ALTER TABLESPACE tablespace_name BEGIN BACKUP;
- 备份数据文件:
在操作系统层面备份表空间对应的数据文件。 - 结束表空间的备份模式:
ALTER TABLESPACE tablespace_name END BACKUP;
这种方法适用于热备份(联机备份)。
- 将表空间设置为备份模式:
恢复Oracle表空间
-
使用RMAN进行恢复
- 将数据库启动到MOUNT状态:
SQL> startup mount;
- 恢复特定表空间:
RMAN> restore tablespace tablespace_name;
- 应用归档日志进行恢复:
RMAN> recover tablespace tablespace_name;
- 打开数据库:
SQL> alter database open;
这些步骤可以在数据库处于MOUNT状态下恢复表空间。
- 将数据库启动到MOUNT状态:
-
使用数据文件的副本进行恢复
- 如果有数据文件的副本,可以使用
SWITCH
命令来替换损坏的数据文件:RMAN> switch datafile datafile_number to copy 'path_to_copy';
- 恢复后,可以使用
RECOVER
命令来应用必要的归档日志。
- 如果有数据文件的副本,可以使用
-
时间点恢复
- 如果需要恢复到特定的时间点,可以使用
UNTIL TIME
子句:RMAN> recover tablespace tablespace_name until time "time_string";
这可以用于恢复到数据库的某个特定时间点,例如在误删除数据之后。
- 如果需要恢复到特定的时间点,可以使用
-
从误删除中恢复
- 如果表空间被误删除,可以通过时间点恢复来恢复整个数据库到删除操作之前的状态,从而间接恢复表空间。
在执行备份和恢复操作时,确保有足够的权限和正确的配置,以避免数据丢失或损坏。同时,定期测试备份和恢复流程,以确保在需要时能够成功执行。