How to Check Why Shutdown Immediate Hangs? [ID 164504.1]

How to Check Why Shutdown Immediate Hangs? [ID 164504.1]

Modified 30-JUN-2010Type HOWTOStatus PUBLISHED

Checked for relevance on 02-Mar-2010

· goal: What information to collect when shutdown immediate is hanging ?

·

· fact: Oracle Server - Enterprise Edition

·

·

fix:

In order to see why shutdown immediate is hanging we need to do the following:

A. While shutdown immediate is hanging

Start Server Manager (or SQL*Plus for 8i or higher)

SVRMGRL> connect internal (or SYSDBA for 8i or higher)

SVRMGRL> select * from x$ktuxe where ktuxecfl = 'DEAD';

This shows dead transactions that smon is looking to rollback.

B. Plan to shutdown again and gather some information. Before issuing the

shutdown immediate command set some events as follows:

SVRMGRL> connect internal

SVRMGRL> alter session set events '10046 trace name context forever,level 12';

SVRMGRL> alter session set events '10400 trace name context forever, level 1';

SVRMGRL> shutdown immediate;

10046 turns on extended SQL_TRACE for the shutdown process.

10400 dumps a systemstate every 5 minutes.

Let the shutdown go for around 15 minutes and then send the traces to Oracle

Support. The traces are written to the location specified by user_dump_dest parameter.

The trace files should show where the time is going.

Note :

Shut down immediate may hang because of various reasons.

- processes still continue to be connected to the database and do not terminate.

- SMON is cleaning temp segments or performing delayed block cleanouts.

- Uncommitted transactions are being rolled back.

------------------------------------------------------------------------------

Blog http://blog.youkuaiyun.com/tianlesoftware

网上资源: http://tianlesoftware.download.youkuaiyun.com

相关视频:http://blog.youkuaiyun.com/tianlesoftware/archive/2009/11/27/4886500.aspx

DBA1 群:62697716(); DBA2 群:62697977()

DBA3 群:62697850 DBA 超级群:63306533;

聊天 群:40132017

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

<think>我们正在解决Redis执行`SHUTDOWN`命令时出现的错误:`(error) ERR Errors trying to SHUTDOWN. Check logs.`。根据引用内容,该错误通常与Redis在关闭时尝试持久化数据(保存RDB快照)但失败有关,而失败的原因往往是权限问题或配置的持久化目录不可写。 根据引用[1]和[2]的分析,我们可以总结出以下步骤: 1. **配置Redis日志**:首先确保Redis配置了日志文件,以便查看详细错误信息。在Redis配置文件(通常为`redis.conf`)中设置`logfile`选项,例如: ``` logfile "/var/log/redis/redis-server.log" ``` 并确保Redis进程对该日志文件所在目录有写入权限。 2. **检查日志**:执行`SHUTDOWN`命令后,查看日志文件中的错误信息。引用[1]中提到,错误可能是由于Redis试图将数据保存到`dump.rdb`文件时因权限不足而失败。 3. **修改持久化目录(dir配置项)**:引用[1]指出,默认的持久化目录(`dir`配置项)可能是Redis可执行文件所在目录(如`/usr/local/bin`),而该目录通常需要较高权限。我们可以: - 创建一个专门用于存放Redis持久化文件的目录,例如`/var/lib/redis`。 - 修改该目录的所有权和权限,确保Redis用户(通常是`redis`)有写入权限: ```bash sudo mkdir -p /var/lib/redis sudo chown redis:redis /var/lib/redis sudo chmod 755 /var/lib/redis ``` - 在Redis配置文件中修改`dir`配置项指向该目录: ```redis.conf dir /var/lib/redis ``` 4. **重启Redis**:修改配置文件后,需要重启Redis服务以使配置生效。注意,如果之前是用`kill -9`强制杀死的进程,现在应该使用系统服务管理命令(如`systemctl`)来重启: ```bash sudo systemctl restart redis ``` 5. **再次尝试关闭**:使用`redis-cli shutdown`命令,此时应该能够正常关闭,因为持久化目录已经可写。 6. **其他可能原因**:如果问题仍然存在,检查以下方面: - **磁盘空间**:确保目标磁盘有足够空间。 - **SELinux/AppArmor**:如果系统启用了安全模块,可能需要调整策略。 - **配置文件其他项**:确保`dbfilename`配置的文件名是合法的。 下面我们给出详细的解决步骤: ### 解决步骤 1. **编辑Redis配置文件** 使用文本编辑器打开Redis配置文件(根据你的安装位置,可能是`/etc/redis/redis.conf`或`/usr/local/etc/redis.conf`): ```bash sudo nano /etc/redis/redis.conf ``` 2. **设置日志文件路径**(如果尚未设置) 找到并修改(或添加)`logfile`配置项,确保指向一个有效的日志文件,并确保Redis用户有写入权限: ```conf logfile "/var/log/redis/redis-server.log" ``` 3. **修改持久化目录** 找到`dir`配置项,将其修改为新建的目录(例如`/var/lib/redis`): ```conf dir /var/lib/redis ``` 4. **创建目录并设置权限** 执行以下命令创建目录并设置权限: ```bash sudo mkdir -p /var/lib/redis sudo chown -R redis:redis /var/lib/redis # 假设运行Redis的用户是redis sudo chmod 755 /var/lib/redis ``` 同时,确保日志文件所在目录存在且Redis用户有权限写入: ```bash sudo mkdir -p /var/log/redis sudo chown -R redis:redis /var/log/redis ``` 5. **重启Redis服务** 使用系统服务命令重启Redis: ```bash sudo systemctl restart redis ``` 6. **测试关闭Redis** 连接Redis并执行关闭命令: ```bash redis-cli shutdown ``` 如果返回`not connected`,则表示关闭成功。检查Redis进程是否已退出: ```bash ps aux | grep redis-server ``` 7. **检查日志确认** 查看日志文件,确认关闭过程中是否有错误: ```bash sudo tail -n 50 /var/log/redis/redis-server.log ``` ### 注意事项 - 如果Redis是通过源码安装且没有配置为系统服务,可能需要使用`redis-server /path/to/redis.conf`启动,并使用`redis-cli shutdown`关闭。 - 在某些系统中,Redis用户可能不是`redis`,请根据实际情况调整(例如,在Ubuntu中,Redis服务用户默认为`redis`)。 ### 其他可能原因及解决方案 - **磁盘空间不足**:清理磁盘空间或增加磁盘容量。 - **配置文件错误**:检查配置文件中是否有语法错误,可使用`redis-server /path/to/redis.conf --test-memory`进行配置测试(但注意这个命令是测试内存的,配置测试主要是检查语法)。 - **安全策略限制**:临时禁用SELinux或AppArmor测试是否因此导致。 通过以上步骤,通常可以解决`SHUTDOWN`命令报错的问题。如果问题依旧,请根据日志中的具体错误信息进一步排查。 ### 相关问题 §§相关问题§§ 1. 如何配置 Redis 的持久化策略(RDB 和 AOF)? 2. Redis 日志文件中常见的错误有哪些,如何解决? 3. 除了修改持久化目录,还有哪些方法可以解决 Redis 权限问题?</think>### Redis SHUTDOWN 命令报错 ERR Errors trying to SHUTDOWN 解决方案 当执行 `redis-cli shutdown` 时出现 `(error) ERR Errors trying to SHUTDOWN. Check logs.` 错误,通常是因为 Redis 在关闭过程中尝试持久化数据(保存 RDB 快照)但失败。以下是系统化的解决步骤: --- ### 1. **配置日志路径(关键第一步)** - 编辑 Redis 配置文件(通常为 `/etc/redis/redis.conf`): ```bash sudo nano /etc/redis/redis.conf ``` - 取消注释并设置日志路径(确保目录存在): ```conf logfile "/var/log/redis/redis-server.log" ``` - 重启 Redis 使配置生效: ```bash sudo systemctl restart redis ``` --- ### 2. **检查日志定位问题** - 查看日志中的具体错误: ```bash sudo tail -50 /var/log/redis/redis-server.log ``` - **常见错误示例**: ```log [1947] 01 Jan 12:00:00.123 * Saving the final RDB snapshot before exiting. [1947] 01 Jan 12:00:00.456 # Failed opening .rdb for saving: Permission denied ``` 此错误表明 Redis 因**权限不足**无法写入 RDB 文件。 --- ### 3. **解决持久化目录权限问题(核心步骤)** - **修改持久化目录**: 1. 创建专用目录并赋权: ```bash sudo mkdir /var/lib/redis sudo chown -R redis:redis /var/lib/redis sudo chmod 770 /var/lib/redis ``` 2. 修改配置文件中的 `dir` 项: ```conf dir /var/lib/redis # 替换默认的./或/usr/local/bin ``` - **修复默认目录权限**(若需保留原路径): ```bash sudo chown redis:redis /usr/local/bin # 根据日志中的路径调整 sudo chmod 755 /usr/local/bin ``` --- ### 4. **其他可能原因及解决方案** | **问题类型** | **解决方案** | |--------------------|----------------------------------------------------------------------------| | **磁盘空间不足** | 清理磁盘:`df -h` 查看使用率,删除无用文件 | | **SELinux限制** | 临时禁用:`sudo setenforce 0` 或添加策略:`sudo semanage fcontext -a -t redis_db_t "/var/lib/redis(/.*)?"` | | **配置文件错误** | 检查 `dbfilename dump.rdb` 配置项是否被篡改 | | **内存不足** | 优化内存设置:`sudo sysctl vm.overcommit_memory=1` | --- ### 5. **验证修复** - 尝试安全关闭: ```bash redis-cli shutdown ``` - 检查进程是否退出: ```bash ps aux | grep redis-server # 应无redis进程 ``` - 确认新 RDB 文件生成: ```bash ls -l /var/lib/redis/dump.rdb # 检查权限和大小 ``` --- ### 预防措施 1. **定期监控日志**: ```bash sudo tail -f /var/log/redis/redis-server.log ``` 2. **设置磁盘空间警报**: 使用 `df -h` 或监控工具检测磁盘使用率。 3. **使用专用目录**: 避免将 `dir` 指向二进制目录(如 `/usr/local/bin`),优先使用 `/var/lib/redis`[^1]。 > 通过以上步骤,95% 的 SHUTDOWN 错误可解决。若问题依旧,请提供日志片段进一步分析[^1][^2]。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值