90-Oracle 对于LOB的数据-新建表空间和分区表

生产现场有些业务表,保存了超多的LOB字段的表,且逐年递增,无优化和减少的趋势。需要定期新增固定大小的 表空间同时对历史表进行分区,分区不能影响其他年份或是继续的业务。和生产商量后,先建立EMRP新的表空间,大小参考去年的使用量(可以增加多个表空间文件),表空间建立后做一下表分区执行。

一、LOB字段分区存储基础

性能优化

  • 分区修剪​:按时间(如就诊日期)分区后,查询2023年数据仅扫描对应分区,避免全表扫描实现年度隔离)。
  • IO均衡​:将BLOB/CLOB单独存储至EMRP52023等表空间,避免与结构化数据竞争IO资源(创建专用表空间)。

存储管理

  • 滚动归档​:年度分区表空间(如EMRP52022→EMRP52023)支持快速归档旧数据(ALTER TABLE ... DROP PARTITION)。
  • 空间预分配​:禁用自动扩展(AUTOEXTEND OFF),通过多数据文件预分配空间(创建多个固定大小的文件),避免碎片化。

运维安全

  • 故障隔离​:单分区损坏不影响整体数据(如2023年分区故障不影响2022年数据)。
  • 独立备份​:可单独备份EMRP52023表空间(文档中未展示但隐含此能力)。

二、操作步骤​

​步骤1、诊断存储状态
## 查询表空间大小和占用率
set linesize 300
SELECT d.status "Status",
       d.tablespace_name "Name",
       d.contents "Type",
       d.extent_management "ExtentManagement",
       to_char(nvl(a.bytes / 1024 / 1024, 0), '99999999.999') "TotalSizeM",
       to_char(nvl(a.bytes - nvl(f.bytes, 0), 0) / 1024 / 1024,'99999999.999') "UsedM",
       to_char(nvl(nvl(f.bytes, 0), 0) / 1024 / 1024, '99999999.999') "FreeM",
       to_char(nvl((a.bytes - nvl(f.bytes, 0)) / a.bytes * 100, 0),'990.00') "Used%"
  FROM sys.dba_tablespaces d,
       (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) a,
       (SELECT tablespace_name, SUM(bytes) bytes FROM dba_free_space GROUP BY tablespace_name) f
 WHERE d.tablespace_name = a.tablespace_name(+)
   AND d.tablespace_name = f.tablespace_name(+)
   ORDER BY ((a.bytes-f.bytes)/a.bytes) desc;            

#查询物理文件大小
SELECT
B.FILE_NAME 物理文件名,
B.TABLESPACE_NAME 表空间名称,
B.BYTES/1024/1024 大小M,
(B.BYTES-SUM(NVL(A.BYTES,0)))/1024/1024 已使用M,
SUBSTR((B.BYTES-SUM(NVL(A.BYTES,0)))/(B.BYTES)*100,1,5) 使用率
FROM DBA_FREE_SPACE A,DBA_DATA_FILES B
WHERE A.FILE_ID=B.FILE_ID
GROUP BY B.TABLESPACE_NAME,B.FILE_NAME,B.BYTES
ORDER BY B.TABLESPACE_NAME;

--查看表空间大小
set linesize 300
col file_name for a50;
col tablespace_name for a16;
col online_status for a10;
col autoextensible for a10;
SELECT file_id,file_name,bytes / 1024 / 1024 AS MB,tablespace_name,online_status,autoextensible FROM dba_data_files;
步骤2、查一下表空间数据文件的存放地址

查看表空间存储物理位置,便于以下新加表空间和表文件dbf

select tablespace_name, file_id, file_name, 
round(bytes/(1024*1024),0) total_space 
from dba_data_files 
order by tablespace_name; 
--
步骤2.创建表空间EMRP52023,作为2023年分区的表空间
create tablespace EMRP52023 datafile '*步骤1中查询出的存放地址*\EMRP5202301.dbf' size 表空间大小(根据生产运行情况设置)
--原dbf文件路径为: /oradata01/orcl/EMRP52022_05.dbf

创建表空间,要保证服务器有足够大小!

不建议自动扩展,同样是为了提高磁盘IO。如果认为表空间大小不够,可以增加表空间数据文件。

--新建表空间,便于以下分区表使用到最新的表空间,直接pl/sql中运行,等待完成
CREATE TABLESPACE EMRP52023 DATAFILE 
  '/oradata01/orcl/EMRP52023_01.dbf' SIZE 4G AUTOEXTEND OFF,
  '/oradata01/orcl/EMRP52023_02.dbf' SIZE 4G AUTOEXTEND OFF,
  '/oradata01/orcl/EMRP52023_03.dbf' SIZE 4G AUTOEXTEND OFF,
  '/oradata01/orcl/EMRP52023_04.dbf' SIZE 4G AUTOEXTEND OFF,
  '/oradata01/orcl/EMRP52023_05.dbf' SIZE 4G AUTOEXTEND OFF 
    LOGGING
    ONLINE
    EXTENT MANAGEMENT LOCAL AUTOALLOCATE
    BLOCKSIZE 8 K
    SEGMENT SPACE MANAGEMENT AUTO
    FLASHBACK ON;
    ----如遇老的表空间容量不足,临时增加dbf文件
    alter tablespace EMRP52023 add datafile '/oradata01/orcl/EMRP52023_06.dbf' SIZE 4G; --20231109添加
 步骤3、查看分区表信息
 select distinct table_name from dba_tab_partitions;
select table_name,partition_name,high_value from dba_tab_partitions;

 步骤4.生成分区脚本,指导文件
select 'ALTER TABLE' || (tab_par.table_name) ||
       ' ADD PARTITION DATE2023' || ' VALUESLESS THAN  (TO_DATE(' || '''' ||
       '2024-1-1' || '''' || ',' || '''' ||'YYYY-MM-DD' || '''' || ')) ' ||
       'TABLESPACE EMRP52023 ;'
  from (select distinct table_name
          from dba_tab_partitions
         where table_owner = 'EMRP用户名') tab_par;

注意:此处若无法查询出分区脚本,可以将EMRP用户名中的英文改成大写字母后尝试执行!为原有OWNER为EMRP50的表,建立新的分区,并使用新的分区指定到分区的隔离时间,执行文件 

步骤5.执行分区脚本并校验

复制查询出来的语句,执行!切换至EMRP50对应的有权限的用户,否则报错

--示例文件
1	ALTER TABLE RCD_OUT_RECORD_DATA ADD PARTITION DATE2023 VALUES LESS THAN  (TO_DATE('2024-1-1','YYYY-MM-DD')) TABLESPACE EMRP52023 ;
2	ALTER TABLE RCD_TEMPERATURE_SPECIAL_DATA ADD PARTITION DATE2023 VALUES LESS THAN  (TO_DATE('2024-1-1','YYYY-MM-DD')) TABLESPACE EMRP52023 ;
3	ALTER TABLE RCD_TEMPERATURE_LIFESIGNDATA ADD PARTITION DATE2023 VALUES LESS THAN  (TO_DATE('2024-1-1','YYYY-MM-DD')) TABLESPACE EMRP52023 ;
4	ALTER TABLE QCM_CRISIS_SCOREDETAIL ADD PARTITION DATE2023 VALUES LESS THAN  (TO_DATE('2024-1-1','YYYY-MM-DD')) TABLESPACE EMRP52023 ;
5	ALTER TABLE DIAG_WESTERN_DIAGNOSE ADD PARTITION DATE2023 VALUES LESS THAN  (TO_DATE('2024-1-1','YYYY-MM-DD')) TABLESPACE EMRP52023 ;
6	ALTER TABLE RCD_NURSE_RECORD_DATA ADD PARTITION DATE2023 VALUES LESS THAN  (TO_DATE('2024-1-1','YYYY-MM-DD')) TABLESPACE EMRP52023 ;
7	ALTER TABLE RCD_INPATIENT_RECORD ADD PARTITION DATE2023 VALUES LESS THAN  (TO_DATE('2024-1-1','YYYY-MM-DD')) TABLESPACE EMRP52023 ;
8

 校验分区表是否成功,在窗口中执行完分区脚本,选几个表校验下是否成功。

 

<think>我们正在讨论的是数据库表空间数据文件合并问题。用户想要将表空间中的多个数据文件合并成一个文件。在Oracle数据库中,表空间可以由多个数据文件组成,但直接"合并"这些物理文件并不是常规操作。通常,我们可以通过重建表空间或迁移数据来实现"单一文件"结构。以下以Oracle数据库为例说明操作步骤: ### 核心思路 1. **创建新表空间**:新建一个只包含单个数据文件的表空间 2. **迁移数据**:将原表空间中的所有对象迁移到新表空间 3. **删除原表空间**:确认迁移完成后删除原表空间及其多个数据文件 ### 详细步骤 #### 步骤1:创建新表空间(单数据文件) ```sql CREATE TABLESPACE new_ts DATAFILE '/u01/app/oracle/oradata/DBNAME/new_ts01.dbf' SIZE 100G AUTOEXTEND ON; ``` - 调整`SIZE`参数确保足够容纳原数据 - 使用`AUTOEXTEND ON`避免空间不足 #### 步骤2:迁移表空间对象 **方法1:移动表** ```sql -- 移动表 ALTER TABLE schema.table_name MOVE TABLESPACE new_ts; -- 移动索引(需重建) ALTER INDEX schema.index_name REBUILD TABLESPACE new_ts; ``` **方法2:使用数据泵(推荐)** ```bash expdp system/password DIRECTORY=dpump_dir DUMPFILE=export.dmp SCHEMAS=schema_name ``` 导入时指定新表空间: ```bash impdp system/password DIRECTORY=dpump_dir DUMPFILE=export.dmp REMAP_TABLESPACE=old_ts:new_ts ``` #### 步骤3:迁移完成后删除原表空间 ```sql -- 先离线表空间确保安全 ALTER TABLESPACE old_ts OFFLINE; -- 确认所有对象已迁移后删除 DROP TABLESPACE old_ts INCLUDING CONTENTS AND DATAFILES; ``` ### 关键注意事项 1. **业务连续性** - 在业务低峰期操作 - 提前通知停服维护 2. **空间需求** -数据文件所在磁盘需有足够空间 - 保留至少20%的冗余空间 3. **对象依赖** - 系统表空间(SYSTEM/SYSAUX)不可迁移 - 检查LOB段、分区表等特殊对象 4. **回退方案** 保留原表空间直至新表空间稳定运行一周 ### 替代方案:调整表空间结构 若只需减少文件数量(非严格单文件),可添加大文件后删除小文件: ```sql -- 添加新的大容量文件 ALTER TABLESPACE users ADD DATAFILE '/path/to/largefile.dbf' SIZE 50G; -- 收缩并删除旧文件 ALTER DATABASE DATAFILE '/path/to/oldfile.dbf' RESIZE 1M; ALTER DATABASE DATAFILE '/path/to/oldfile.dbf' OFFLINE; DROP DATAFILE '/path/to/oldfile.dbf'; ``` ### 性能影响对比 | 操作方式 | 停机时间 | 风险 | 适用场景 | |----------------|----------|------|------------------------| | 表/索引移动 | 高 | 中 | 小型数据库 | | 数据泵迁移 | 中 | 低 | 中大型数据库 | | 调整文件结构 | 低 | 高 | 最小化停机时间的情况 | > 注:MySQL/PostgreSQL数据库原理类似,具体命令需调整[^3][^5]。 --- ### 相关问题 1. 如何监控Oracle表空间使用情况? 2. 数据库表空间碎片整理有哪些方法? 3. 多数据文件表空间如何优化IO性能? 4. 数据泵导入导出有哪些性能优化技巧? 5. 表空间迁移后如何验证数据完整性? > 提示:操作前务必备份!可使用`RMAN`进行全库备份: > ```bash > rman target / > BACKUP DATABASE PLUS ARCHIVELOG; > ```[^1][^4]</think>### 如何将数据库表空间中的多个数据文件合并成一个文件 在数据库管理中,合并表空间中的多个数据文件为一个文件的核心操作是**重建表空间**。以下是详细步骤(以Oracle数据库为例,其他数据库原理类似): --- ### 步骤1:创建新表空间(单数据文件) ```sql CREATE TABLESPACE merged_ts DATAFILE '/u01/app/oracle/oradata/DBNAME/merged.dbf' SIZE 10G AUTOEXTEND ON; ``` - `SIZE`需大于原表空间总大小 - `AUTOEXTEND ON`确保空间自动扩展[^1] --- ### 步骤2:迁移对象到新表空间 #### 迁移表: ```sql ALTER TABLE schema.table_name MOVE TABLESPACE merged_ts; ``` #### 迁移索引(需重建): ```sql ALTER INDEX schema.index_name REBUILD TABLESPACE merged_ts; ``` #### 迁移LOB字段: ```sql ALTER TABLE schema.table_name MOVE LOB(lob_column) STORE AS (TABLESPACE merged_ts); ``` --- ### 步骤3:删除原表空间 ```sql -- 确认所有对象已迁移 SELECT table_name FROM dba_tables WHERE tablespace_name='OLD_TS'; -- 删除原表空间(含数据文件) DROP TABLESPACE old_ts INCLUDING CONTENTS AND DATAFILES; ``` --- ### 关键注意事项 1. **业务影响** - 在维护窗口操作 - 提前通知停服(迁移过程锁表) 2. **空间要求** - 新存储位置需有足够空间 - 保留原文件直至验证完成 3. **特殊对象处理** - 分区表:需按分区迁移 - 物化视图:需重建 - 系统对象:`SYSTEM`/`SYSAUX`表空间不可迁移 4. **回退方案** ```sql -- 若迁移失败 ALTER TABLE schema.table_name MOVE TABLESPACE old_ts; ``` --- ### 替代方案:表空间重组 若需保留原表空间,可收缩文件后删除多余文件: ```sql -- 收缩数据文件 ALTER DATABASE DATAFILE '/path/file1.dbf' RESIZE 100M; -- 离线后删除 ALTER DATABASE DATAFILE '/path/file2.dbf' OFFLINE; DROP DATAFILE '/path/file2.dbf'; ``` > ⚠️ 此方法仅减少文件数,无法实现单文件合并 --- ### 不同数据库实现对比 | 数据库 | 合并方法 | 关键命令 | |-----------|------------------------------|------------------------------| | **MySQL** | 重建表空间 + 导出导入 | `ALTER TABLE ... DISCARD TABLESPACE` | | **SQL Server** | 文件组收缩 | `DBCC SHRINKFILE` | | **PostgreSQL** | 表空间迁移 | `pg_dump` + `pg_restore` | --- ### 性能优化建议 1. **并行迁移**(Oracle): ```sql ALTER TABLE table_name MOVE PARALLEL 8; ``` 2. **分批操作**: - 按业务模块分批迁移 - 优先迁移非核心表 3. **日志最小化**: ```sql ALTER TABLE table_name NOLOGGING; -- 迁移完成后恢复 ALTER TABLE table_name LOGGING; ``` --- ### 相关问题 1. 如何监控表空间使用率? 2. 数据库表空间碎片整理有哪些方法? 3. 多数据文件表空间如何优化IO性能? 4. 表空间迁移后如何验证数据完整性? 5. 云数据库(如RDS)是否支持表空间合并? > 操作前务必备份!推荐使用RMAN备份: > ```bash > rman target / > BACKUP TABLESPACE old_ts; > ```[^3][^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值