Oracle 11g 导出空表解决方案

需积分: 50 4 下载量 184 浏览量 更新于2024-09-07 收藏 1KB TXT 举报
"Oracle 11g数据库在处理空表时,由于其新特性,可能会导致空表在导出时不被包括。这个问题可以通过两种方法来解决:一种是通过插入并回滚操作来创建segment;另一种是调整数据库的deferred_segment_creation参数。" 在Oracle 11g中,如果一个表没有数据,系统会延迟段的创建,以节省存储空间。然而,这种优化策略可能在需要导出数据时造成问题,因为没有数据的表(空表)不会分配segment,从而在导出过程中无法识别和包含这些表。以下是两种解决这个问题的方法: 1. 插入并回滚法: 在空表中插入一条数据,即使之后立即执行回滚操作,也会导致表的segment被创建。这样,当执行导出操作时,空表就会被正确地包含在导出文件中。例如,可以使用以下SQL语句: ```sql INSERT INTO table_name VALUES (null); ROLLBACK; ``` 这将确保表在逻辑上保持为空,但在物理上已有一个段存在,以便导出。 2. 调整deferred_segment_creation参数: Oracle 11g允许用户通过设置`deferred_segment_creation`参数来控制这个行为。默认情况下,这个参数可能设置为`TRUE`,表示在有数据插入时才创建段。要改变这个设置,可以运行以下命令: ```sql ALTER SYSTEM SET deferred_segment_creation = FALSE; ``` 这将全局禁用延迟段创建功能,使得所有新创建的表都会立即分配段,无论它们是否包含数据。要确认设置是否已更改,可以使用`SHOW PARAMETER deferred_segment_creation`命令。 在调整参数后,如果需要导出数据,所有空表都应该已经被分配了段,能够正常被导出。如果已经知道哪些表是空的,可以使用查询来找出这些表,并手动分配扩展: ```sql SELECT 'ALTER TABLE ' || table_name || ' ALLOCATE EXTENT;' FROM user_tables WHERE num_rows = 0; ``` 执行查询结果中的SQL语句,将为每个空表分配一个扩展,确保它们在导出时被包含。 总结来说,Oracle 11g的空表导出问题可以通过插入并回滚数据或调整数据库参数来解决。这两种方法都能确保空表在导出时被正确处理,即使它们在物理上没有数据。对于Java开发者或其他需要与Oracle数据库交互的应用程序来说,了解这个特性及其解决方法是非常重要的,因为这可能会影响到数据备份、迁移或者同步等操作。
2020-05-19 上传
1、提供了oracle数据库备份脚本,导出dmp文件 2、定时任务由操作系统提供的支持,在操作系统中设置定时任务,由操作系统定期执行脚本 3、补充。压缩包脚本有点问题,不能删除旧的备份文件。需要自动删除历史备份文件请用最新脚本: @echo off @echo ================================================ @echo windows环境下Oracle数据库的自动备份脚本 @echo 说明:启动备份时,需要配置以下变量 @echo 1、BACKUP_DIR 指定要备份到哪个目录 @echo 2、ORACLE_USERNAME 指定备份所用的Oracle用户名 @echo 3、ORACLE_PASSWORD 指定备份所用的Oracle密码 @echo 4、ORACLE_DB 指定备份所用的Oracle连接名 @echo 5、BACK_OPTION 备份选项,可以为空,可以为full=y,可以为owner=a用户,b用户 等等.... @echo 6、RAR_CMD 指定RAR命令行压缩工具所在目录 @echo ================================================ rem 以下变量需要根据实际情况配置 set BACKUP_DIR=D:\tools\oracle_bak\backup230 set ORACLE_USERNAME=PLATADMIN set ORACLE_PASSWORD=123456 set ORACLE_DB=ORCL set BACK_OPTION=owner=PLATADMIN set RAR_CMD="D:/Program Files/WinRAR/Rar.exe" rem for /f "tokens=1,2" %%a in ('date/t') do set TODAY=%%a rem set BACK_NAME=%ORACLE_DB%_%TODAY%(%time:~0,2%时%time:~3,2%分)_ set BACK_NAME=%Date:~0,4%%Date:~5,2%%Date:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2% set BACK_FULL_NAME=%BACKUP_DIR%/%BACK_NAME% rem 开始备份 exp %ORACLE_USERNAME%/%ORACLE_PASSWORD%@%ORACLE_DB% %BACK_OPTION% file="%BACK_FULL_NAME%.dmp" log="%BACK_FULL_NAME%exp.log" rem 压缩并删除原有文件 %RAR_CMD% a -df "%BACK_FULL_NAME%back.rar" "%BACK_FULL_NAME%.dmp" "%BACK_FULL_NAME%exp.log" rem 删除15天前的备份文件 forfiles /p %BACKUP_DIR% /s /m *.rar /d -15 /c "cmd /c del @file"