• ORA-01940 无法删除当前已连接的用户之解决方案(脚本)


    第一部分:配置数据库连接

    1. 安装ODBC

    yum -y install unixODBC unixODBC-devel

    2. 安装Oracle-instantclient 

    1. #以下所有操作使用root账号执行
    2. #创建目录
    3. mkdir -p /opt/oracle
    4. cd /opt/oracle
    5. #下载odbc安装包
    6. wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-basic-21.3.0.0.0-1.x86_64.rpm
    7. wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-sqlplus-21.3.0.0.0-1.x86_64.rpm
    8. wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-devel-21.3.0.0.0-1.x86_64.rpm
    9. wget https://download.oracle.com/otn_software/linux/instantclient/213000/oracle-instantclient-odbc-21.3.0.0.0-1.x86_64.rpm
    10. #安装unixODBC和unixODBC-devel
    11. yum -y install unixODBC unixODBC-devel
    12. #安装oracle-instantclient
    13. yum localinstall oracle-instantclient-*
    14. #oracle-instantclient的安装位置如下
    15. /usr/lib/oracle/21/client64
    16. /usr/share/oracle/21/client64
    17. /usr/include/oracle/21/client64

    3. 配置SQLPlus连接  完颜振江
    直接通过下面的命令安装 oracle-instantclient创建 network/admin 文件夹

    1. mkdir /usr/lib/oracle/21/client64/network/admin/ -p
    2. cd /usr/lib/oracle/21/client64/network/admin/
    3. vim tnsnames.ora
    4. HOST写oracle数据库服务器IP地址,
    5. SERVICE_NAME写global_name
    6. sqlplus / as sysdba
    7. select global_name from global_name;

     

    1. ORCL =
    2. (DESCRIPTION =
    3. (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.61.105)(PORT = 1521))
    4. (CONNECT_DATA =
    5. (SERVER = DEDICATED)
    6. (SERVICE_NAME = ORCL)
    7. )
    8. )

    4. 环境变量配置

    1. export ORACLE_HOME=/usr/lib/oracle/21/client64
    2. export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib64:$LD_LIBRARY_PATH
    3. export TNS_ADMIN=$ORACLE_HOME/network/admin
    4. export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
    5. export ORACLE_SID=ORCL
    6. #保存后适用新的环境变量
    7. source /etc/profile
    8. #配置类库
    9. chmod +x /usr/lib/oracle/21/client64/lib/libsqora.so.21.1
    10. cd /usr/lib64
    11. ln -s libodbcinst.so.2.0.0 libodbcinst.so.1

    5.测试连接,出现如下信息表示成功

    sqlplus NCC10/XXXXX@ORCL

    1. #sqlplus NCC10/XXXX@ORCL
    2. SQL*Plus: Release 21.0.0.0.0 - Production on Tue Nov 15 17:19:33 2022
    3. Version 21.3.0.0.0
    4. Copyright (c) 1982, 2021, Oracle. All rights reserved.
    5. Last Successful login time: Tue Nov 15 2022 17:12:14 +08:00
    6. Connected to:
    7. Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    8. Version 19.12.0.0.0
    9. SQL>

    第二部分:脚本

    1. #cat cascade.sh
    2. #!/bin/bash
    3. ID=$1
    4. sqlplus NCC10/XXXX@ORCL > /aliyun/NCC/oracle/Tmp/list << EOF
    5. select username,sid,serial#,paddr from v\$session where username='$ID';
    6. EOF
    7. less /aliyun/NCC/oracle/Tmp/list| grep [0-9]|awk '{if (NR%2==0) {print} else {printf "%s:",$0}}'|grep -Ev 'Oracle|Release|Version'|awk '{print $1" "$2" "$3}'|sed 's/://g' >/aliyun/NCC/oracle/list
    8. #echo "select username,sid,serial#,paddr from v\$session where username='$ID';";
    9. while read a b c
    10. do
    11. echo "alter system kill session '$b,$c';";
    12. done < /aliyun/NCC/oracle/list
    13. echo "drop user $ID cascade; ;"

    注释:

    1.连接并把执行结果输出到/aliyun/NCC/oracle/Tmp/list;sqlplus NCC10/XXXX@ORCL > /aliyun/NCC/oracle/Tmp/list

    2.执行的sql语句(可以根据自己的需求调整)select username,sid,serial#,paddr from v\$session where username='$ID';

    3、less是对输出文件的处理

    执行输出如下

    1. #./cascade.sh NCC10
    2. alter system kill session '25,64344';
    3. alter system kill session '198,42428';
    4. alter system kill session '223,3497';
    5. alter system kill session '402,8434';
    6. alter system kill session '415,11774';
    7. alter system kill session '588,28512';
    8. alter system kill session '602,1934';
    9. alter system kill session '794,46347';
    10. alter system kill session '970,58980';
    11. alter system kill session '980,21601';
    12. drop user NCC10 cascade; ;

    直接多次执行就可以删除需要被删除的oracle的实例

    PS:遵循的流程

    1. ORA-01940 无法删除当前已连接的用户之解决方案
    2. SQL> drop user ecity ;
    3. ERROR at line 1:
    4. ORA-01940: cannot drop a user that is currently connected
    5. 解决方案:
    6. 首先查询一下数据中有没有用户在使用
    7. SQL> select username,sid,serial#,paddr from v$session where username='ECITY';
    8. USERNAME SID SERIAL# PADDR
    9. 其次杀掉系统中的这个进程
    10. SQL> alter system kill session '${SID},${SERIAL}';
    11. SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
    12. 然后执行删除操作,即可完成
    13. SQL> drop user ecity CASCADE;
    14. User dropped.
    15. 一直杀不干净咋办(列出所有的SID和SERIAL)和删除用户的命令一起执行
    16. SQL> alter system kill session '${SID},${SERIAL}';
    17. SQL> drop user ecity CASCADE;

  • 相关阅读:
    MATLB|基于复杂网络的配电系统微电网优化配置
    idleTASK,分析。
    Redis持久化与主从复制
    【IPC 通信】信号处理接口 Signal API(2)
    一台新电脑进行 Web 页面请求的历程
    C++unordered_map/set容器实现
    Zookeeper入门
    React Router 参数使用详解
    109.(leaflet篇)leaflet实现沿轨迹线播放
    ExtJS-Localization(本地化)
  • 原文地址:https://blog.csdn.net/ethnicitybeta/article/details/127869815