Database File Management ->> Shrink Data File

今天在开发环境遇到了一个问题,我们发现服务器上的硬盘空间满了,查看了下发现这个盘存放的数据库文件应该是来源一个并非很大的库才对。检查之后发现这个数据库下的某个数据文件占了盘符下70%的空间,而大部分数据都来自某张表。但是即便我删除了该表里面所有的数据,这个数据文件并不会把空间都还给操作系统啊。那就面临一个如何把收缩文件大小的问题了。我最先想到的还是SQL Server下的DBCC SHRINKFILE命令,按道理来讲连续执行两条DBCC SHRINKFILE命令应该是可以达到收缩数据库文件大小的目的的。

第一条命令把文件尾部的页面尽量往文件内部靠前的空闲页面填充,这种适用于数据文件而不适用于日志文件;第二条命令把文件尾部的空白页面截断并还给操作系统。这样看好像便可以达到目的了。但是,这两条命令跑起来太慢了。首先这个文件是100GB大小,使用页面所占空间其实只有十分之一也就是10GB。第二条命令我花了快3个小时都没跑完。而且重要的是,第二条命令会造成blocking的现象。在SHRINKFILE的过程中出现某位同事无法访问某张表存储在该文件中的数据。

USE [YourDB]
GO

DBCC SHRINKFILE (28, NOTRUNCATE);
DBCC SHRINKFILE (28, TRUNCATEONLY);

于是乎我想到了另外一个办法,那就是把数据倒到另外一个盘下的文件(这里需要同一个文件组),然后把这个文件delete掉,ALTER DATABASE修改文件的路径,把文件路径设成原先盘符下的文件,再set database offline,把文件拷贝回原先的盘符,再set database online。这样就大功告成了。这种做法适用于本身文件的实际页面所有空间比例很小,比如我这个例子,百分之十,那用这种办法很好解决。至于说上一种办法,有时间再实验下是否成立。

时间: 2024-10-09 17:48:26

Database File Management ->> Shrink Data File的相关文章

oracle data file header replace(测)

SQL> create tablespace rm_tbs datafile 'f1.dbf' size 10m; Tablespace created. SQL> select file#,name from v$datafile; [[email protected] ~]$ rm /home/oracle/product/10g/dbs/f1.dbf [[email protected] ~]$ exit exit SQL> select file#,name from v$dat

azure云迁移后expdp报错ORA-01110: data file 201: '/home/oradata/powerdes/temp01.dbf'

1,expdp的时候报错: 在idc的oracle服务器上正常导入导出都ok的,但是到了azure云上就出故障了: [[email protected] oracle]$ expdp \'powerdesk/testcrmfile\' directory=DIR_DUMP tables=bis_floor,bis_shop,bis_shop_conn,bis_store,bis_cont dumpfile=zhengyin.qu_bak_$(date +%Y%m%d)_02.dmp Export

ORA-01157报错"cannot identify/lock data file"解决

sqlplus以管理员方式接入数据库,启动时出现报错,如下: > sqlplus "/as sysdba" SQL> startup ...... ORA-01157: cannot identify/lock data file 8 - see DBWR trace file ORA-01110: data file 8: '/tmp/test.dbf' 查看数据库日志文件alert_$ORACLE_SID.log,存在对应报错信息: Errors in file ...

RMAN恢复报错: ORA-01103: database name 'POWERDES' in control file is not 'PDUNQ'

执行rman恢复的时候报错 RMAN> alter database mount; RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: ====================================================

ORACLE 11G收缩表空间报错 ORA-03297: file contains used data beyondrequested RESIZE value

测试环境磁盘空间不足,所以drop一些无用的大表,但是发现空间没有变化,df -h还是没有释放出磁盘空间来. SQL> set line 200 SQL> set pagesize 200 SQL> col name format A150 1,查看表空间使用情况 SQL> SELECTUPPER(F.TABLESPACE_NAME) "表空间名", 2 D.TOT_GROOTTE_MB "表空间大小(M)", 3 D.TOT_GROOTTE

【oracle】oracledba9 Rename the read-only data file to their correct file names.

One of the tablespace is read-only in your database. The los s of all control file forced you to recreate the control file. Which operation do you need to perform after re-creating the control file and opening the database? A. Drop and re-create the 

Oracle 12c ORA-01516: nonexistent log file, data file, or temporary file "10"

执行alter database move操作报错ORA-01516: SQL> alter database move datafile '/u01/app/oracle/oradata/cdb/pdb/pdb_users01.dbf' to '/u01/app/pdb_user01.dbf'; alter database move datafile '/u01/app/oracle/oradata/cdb/pdb/pdb_users01.dbf' to '/u01/app/pdb_user

How to Change Default Location for Outlook Data File (PST & OST)

Is there a way to change the default location of new .pst file when create a new e-mail account in Outlook? Different versions of Outlook use different default locations to store pst files. In this tutorial we'll show you how to change default locati

InnoDB: auto-extending data file ./ibdata1 is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!

问题描述: centos 安装MySQL $yum install mysql-server 安装之后执行命令mysql 报错: 查看mysql的启动日志: [ERROR] InnoDB: auto-extending data file ./ibdata1 is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevan