数据库 'xxx' 已打开,并且一次只能有一个用户访问

本文详细介绍了在遇到数据库被设置为单用户模式时,导致分离失败的情况,提供了两种方法来杀掉所有连接的进程,并将数据库设置回多用户模式,从而顺利分离数据库。

早上过来准备将服务器的数据库分离,因为这个服务器的数据已经不在需要,但是在分离的时候发现出现如下错误:数据库 'xxx' 已打开,并且一次只能有一个用户访问,后来查看数据库的选项,果然被设置为了[SINGLE_USER],导致无法分离,估计是昨晚在备份数据库之后不知道如何的就设置为了[SINGLE_USER]吧,现在需要将其设置为多用户的模式,在设置多用户模式的时候可能会因为还有其它进程的连接导致设置无法进行,所以需要杀掉所有连接的进程。使用如下SQL语句即可。

方法一:

USE master; 
GO 
DECLARE @SQL VARCHAR(3000);
SET @SQL = '';
SELECT @SQL = @SQL+'; KILL ' + RTRIM(SPID)
FROM [sys].[sysprocesses] AS sps
WHERE [sps].[dbid] = DB_ID('test'); 
SET @SQL = SUBSTRING(@SQL, 2, LEN(@SQL));
EXEC(@SQL);
GO

方法二:

DECLARE @DBName SYSNAME;
SET @DBName = 'BI_Monitor'; --这个是要删除的数据库库名    
     
DECLARE @KSQL NVARCHAR(1000)
DECLARE tb CURSOR LOCAL
FOR  
SELECT
    KSQL = 'KILL ' + CAST([sps].[spid] AS NVARCHAR(10))
FROM [sys].[sysprocesses] AS sps
WHERE dbid = DB_ID(@DBName)--查询@DBName相关的线程
    
--循环杀掉要删除数据的相关线程
OPEN tb
FETCH NEXT FROM tb INTO @KSQL
WHILE @@FETCH_STATUS = 0  
BEGIN  
    EXECUTE(@KSQL);
    FETCH NEXT FROM tb INTO @KSQL
END 
CLOSE tb    
DEALLOCATE tb

最后再将相应数据库设置为多用户模式即可。

ALTER DATABASE [test] SET MULTI_USER;--设置为多用户模式



在 Oracle 数据库中,RMAN(Recovery Manager)是用于备份、恢复和修复数据库的官方工具。当数据文件损坏时,可以使用 RMAN 将数据库恢复到最近一次有效备份的状态。 下面是一个完整的模拟场景: 1. 模拟数据文件损坏(例如删除或破坏某个数据文件) 2. 使用 RMAN 执行恢复操作,将数据库恢复至最近一次备份状态 --- ### ✅ 前提条件: - 已启用归档日志模式(ARCHIVELOG) - 已进行过至少一次 RMAN 完整备份 - 数据库为非只读,并可进入 MOUNT 或 OPEN 状态 --- ## 一、步骤演示:模拟损坏并使用 RMAN 恢复 ### 步骤 1:确认数据库处于归档模式 ```sql SQL> SELECT log_mode FROM v$database; LOG_MODE ------------ ARCHIVELOG ``` 如果不是 `ARCHIVELOG`,需执行: ```sql SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; ``` --- ### 步骤 2:使用 RMAN 进行全库备份(假设已有备份) ```bash rman target / RMAN> BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT; # 输出类似: # Backup set written to device type disk format /u01/app/oracle/fast_recovery_area/ORCL/backupset/... ``` --- ### 步骤 3:模拟数据文件损坏 假设 `USERS` 表空间的数据文件路径为 `/u01/app/oracle/oradata/orcl/users01.dbf` **手动删除该文件(模拟损坏):** ```bash rm /u01/app/oracle/oradata/orcl/users01.dbf ``` 此时尝试访问该表空间的对象会出错: ```sql SQL> SELECT * FROM scott.emp; -- 可能报错 ORA-01116: error in opening database file ``` --- ### 步骤 4:使用 RMAN 恢复数据文件 ```bash rman target / # 启动 RMAN 并连接目标数据库 ``` #### 在 RMAN 中执行以下命令: ```rman RUN { # 如果实例未启动,则先启动到 mount 状态 STARTUP MOUNT; -- 若数据库已崩溃无法打开 # 检查哪些文件需要恢复 RESTORE DATABASE; # 应用归档日志和重做日志进行介质恢复 RECOVER DATABASE; # 打开数据库 ALTER DATABASE OPEN; } ``` 或者更精确地只恢复特定损坏的数据文件: ```rman -- 查询哪个文件损坏(也可以从 alert.log 获取) LIST FAILURE; -- 更实用的方式:单独恢复 users 表空间对应的数据文件 RESTORE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf'; RECOVER DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf'; ALTER DATABASE OPEN; ``` > 注意:如果数据库仍能启动但某些文件不可访问,也可在 `OPEN` 状态下脱机恢复: > > ```sql > ALTER TABLESPACE users OFFLINE; > -- 然后在 RMAN 中 restore & recover > ALTER TABLESPACE users ONLINE; > ``` --- ### 步骤 5:验证恢复结果 ```sql SQL> SELECT COUNT(*) FROM scott.emp; -- 应该正常返回记录数 ``` 查看告警日志确认无 I/O 错误。 --- ## 二、关键代码解释 ```rman RESTORE DATABASE; ``` - 从最近的备份集中将所有数据文件复制回原位置。 - RMAN 自动选择最新的完整备份作为基础。 ```rman RECOVER DATABASE; ``` - 应用归档日志和在线重做日志中的变更,使数据文件与控制文件同步。 - 实现“前滚”(Rolling forward)到最新可用时间点。 ```rman ALTER DATABASE OPEN; ``` - 成功恢复后打开数据库供正常使用。 --- ## 三、补充建议 - 开启 **Fast Recovery Area (FRA)** 以便自动管理备份存储。 - 定期运行 `CROSSCHECK` 和 `DELETE EXPIRED` 清理 RMAN 备份元数据。 - 使用脚本化备份策略(如每周全备 + 每日增量)。 --- ## 四、常见错误处理 | 错误 | 解决方法 | |------|---------| | `ORA-01110: data file X: '...'` | 文件缺失,需 restore | | `RMAN-06023: no backup or copy of datafile found` | 缺少对应备份,请检查是否备份了该文件 | | `ORA-00279: change XXX generated at ... not yet available` | 需要归档日志,确保 `PLUS ARCHIVELOG` 已备份 | --- ### ✅ 总结流程: 1. 损坏发生 → 数据库可能无法打开或查询异常 2. 使用 RMAN 连接目标库 3. `RESTORE` 把备份文件还原到磁盘 4. `RECOVER` 应用日志前滚到一致状态 5. `OPEN` 数据库恢复正常服务 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值