发布网友 发布时间:2022-04-14 12:44
共3个回答
懂视网 时间:2022-04-14 17:05
因为意外原因(掉电,人为杀死进程)导致回滚段中的数据没有提交,回滚段中保留大量数据无法去除,我想到的办法就是重建表空间。当Oracle中当读写大批量数据时候,如果不及时提交任务,会导致回滚表空间的迅速增加,回滚表空间会一直增大,而不自动释放它占
因为意外原因(掉电,人为杀死进程)导致回滚段中的数据没有提交,回滚段中保留大量数据无法去除,我想到的办法就是重建表空间。当Oracle中当读写大批量数据时候,如果不及时提交任务,会导致回滚表空间的迅速增加,回滚表空间会一直增大,而不自动释放它占用的硬盘空间,(当然,几个小时后,系统会自动释放它自身的占用率,但不会释放它所占用的硬盘空间),这时,也可以通过重建表空间来解决。
1、重建回滚表空间方法,
思路:先新建回滚表空间,再重新定向到新建的回滚表空间,然后删除掉原来的回滚表空间。如果觉得有必要,可以再重建原来的表空间,删除新建的表空间。
-- 创建备用undo表空间
create undo tablespace undotbs2 datafile '/opt/app/oracle/oradata/orcl/undotbs02.dbf' size 100m
-- 切换undo表空间,使系统使用新建的回滚表空间
alter system set undo_tablespace=undotbs2 scope=spfile
--关闭服务
shutdown immediate
--重新启动服务
startup
-- 删除掉原来的混滚表空间
drop tablespace undotbs1 including contents and datafiles;
-- 创建原undo表空间
create undo tablespace undotbs1 datafile '/opt/app/oracle/oradata/orcl/undotbs01.dbf' size 1000m;
-- 切换undo表空间
alter system set undo_tablespace=undotbs1 scope=spfile;
-- 关闭重起并把备用undo表空间drop
shutdown immediate
startup
drop tablespace undotbs2 including contents and datafiles;
2、回滚段无法删除的处理
症状:
删除回滚段表空间(drop tablespace undotbs1 including contents)的时候报下面的错
ORA-01548: 已找到活动回退段'_SYSSMU1$',终止删除表空间
处理过程:
1 create undo tablespace undotbs2 datafile '/opt/app/oracle/oradata/orcl/undotbs02.dbf' size 100m;
alter system set undo_tablespace=undotbs2;
drop tablespace undotbs1 including contents;(进行这部操作的时候会报下面的错):
ORA-01548: 已找到活动回退段'_SYSSMU1$',终止删除表空间
2 修改文件/opt/app/oracle/admin/orcl/pfile/init.ora.913201117448,如下:
undo_management=manual
undo_retention=10800
undo_tablespace=undotbs2
_CORRUPTED_ROLLBACK_SEGMENTS =(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
3 启动服务
startup pfile=/opt/app/oracle/admin/orcl/pfile/init.ora.913201117448
4 删除表空间
drop tablespace undotbs1 including contents;
create undo tablespace undotBS1 datafile '/opt/app/oracle/oradata/orcl/undotbs01.dbf' size 1000m;
5 修改init.ora.913201117448,如下:
undo_management=auto
undo_retention=10800
undo_tablespace=undotBS1
#_CORRUPTED_ROLLBACK_SEGMENTS =(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
6 关闭服务shutdown immediate,并且用下面的命令重新启动服务
startup pfile=/opt/app/oracle/admin/orcl/pfile/init.ora.913201117448
7 拷贝spfile文件,原先的spfile文件做好备份
create spfile='/opt/app/oracle/product/10.1.0/db_1/dbs/spfileorcl.ora' from pfile='/opt/app/oracle/admin/orcl/pfile/init.ora.913201117448'
8 关闭服务器shutdown immediate,重新启动服务器startup,删除新建表空间,即可。
drop tablespace undotbs2 including contents and datafiles;
select segment_name,status,tablespace_name from dba_rollback_segs;
SEGMENT_NAME STATUS TABLESPACE_NAME
------------------------------ ---------------- ------------------------------
SYSTEM ONLINE SYSTEM
_SYSSMU1$ ONLINE UNDOTBS1
_SYSSMU2$ ONLINE UNDOTBS1
_SYSSMU3$ ONLINE UNDOTBS1
_SYSSMU4$ ONLINE UNDOTBS1
_SYSSMU5$ ONLINE UNDOTBS1
_SYSSMU6$ ONLINE UNDOTBS1
_SYSSMU7$ ONLINE UNDOTBS1
_SYSSMU8$ ONLINE UNDOTBS1
_SYSSMU9$ ONLINE UNDOTBS1
_SYSSMU10$ ONLINE UNDOTBS1
11 rows selected.
热心网友 时间:2022-04-14 14:13
因为innodb的auto_increament的计数器记录的当前值是保存在存内 存中的,并不是存在于磁盘上,当mysql server处于运行的时候,这个计数值只会随着insert改增长,不会随着delete而减少。而当mysql server启动时,当我们需要去查询auto_increment计数值时,mysql便会自动执行:SELECT MAX(id) FROM 表名 FOR UPDATE;语句来获得当前auto_increment列的最大值,然后将这个值放到auto_increment计数器中。所以就算 Rollback MySQL的auto_increament计数器也不会作负运算。热心网友 时间:2022-04-14 15:31
回滚表空间