Oracle kill session相关问题(下)
本篇接着上篇讲 Oracle kill session相关问题(上):http://blog.itpub.net/26736162/viewspace-2121019/
若没有dba角色或者没有alter system权限的话,业务用户就不能自己杀自己会话了,这样一来,只能dba来介入了,其实这个功能我们可以通过如下的SQL脚本来完成。
------- user replace XXXXXX
------- 普通用户可以kill自己的session 授予应用用户杀自己session的权限
create or replace view vw_myownersession_lhr
as
select * from v$session where username = USER;
create or replace public synonym syn_myownersession_lhr for sys.vw_myownersession_lhr;
create or replace procedure pro_kill_myown_session_lhr( p_sid in varchar2,p_serial# in varchar2)
is
cursor_name pls_integer default dbms_sql.open_cursor;
ignore pls_integer;
BEGIN
select count(*) into ignore
from v$session
where username = USER
and sid = p_sid
and serial# = p_serial# ;
if ( ignore = 1 )
then
dbms_sql.parse(cursor_name,'alter system disconnect session '''||p_sid||','||p_serial#||''' immediate',dbms_sql.native);
ignore := dbms_sql.execute(cursor_name);
else
raise_application_error( -20001,'You do not own session ''' ||p_sid || ',' || p_serial# ||'''' );
end if;
END pro_kill_myown_session_lhr;
/
create or replace public synonym pro_kill_session_lhr for sys.pro_kill_myown_session_lhr;
grant select on syn_myownersession_lhr to XXXXXX;
grant execute on pro_kill_session_lhr to XXXXXX;
SELECT USERENV('SID') FROM DUAL;
select sid,serial#,paddr,status from syn_myownersession_lhr where sid=19;
exec pro_kill_session_lhr(19,15);
Alter system disconnect session 是一个可选的kill session 的方法。 与kill session 命令不同,disconnect session 命令会kill 掉 dedicated server process, 该命令等同于在操作系统级别kill 掉server process。
具体语法如下:
SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' POST_TRANSACTION;
SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' IMMEDIATE;
POST_TRANSACTION 选项会等待事务完成之后在断开连接。
IMMEDIATE 选项会立即断开连接,然后事务会进行recover操作。
这2个选项也可以一起使用,但是必须指定其中一个,否则就会报错:
SQL> alter system disconnect session'30,7';
alter system disconnect session '30,7'
*
ERROR at line 1:
ORA-02000: missing POST_TRANSACTION orIMMEDIATE keyword
SQL>
SQL> alter system disconnect session'15,12' post_transaction immediate;
System altered.
使用alter system disconnectsession 命令就不需要切换到系统来kill session,也从而减少了kill 错进程的几率。
PMON进程负责处理异常结束进程相关资源的释放。PMON周期性地被唤醒,可以对"_PKT_PMON_INTERVAL"这个隐藏参数来进行修改,默认为50秒。也可以通过查找出进程的PID,然后在oradebug中,执行命令oradebug wakeup orapid(oracle进程的PID,不是OS的PID)来手动唤醒PMON进程。可以用alter session set events '100246 trace name conext forever,level 4'来查看PMON的相关操作。
SYS@LHRDGZK1> SELECT a.INDX,
2 a.KSPPINM NAME,
3 a.KSPPDESC,
4 b.KSPPSTVL
5 FROM x$ksppi a,
6 x$ksppcv b
7 WHERE a.INDX = b.INDX
8 and lower(a.KSPPINM) like lower('%?meter%');
Enter value for parameter: _PKT_PMON_INTERVAL
old 8: and lower(a.KSPPINM) like lower('%?meter%')
new 8: and lower(a.KSPPINM) like lower('%_PKT_PMON_INTERVAL%')
INDX NAME KSPPDESC KSPPSTVL
----- ---------------------- ------------------------------------ --------------------
61 _pkt_pmon_interval PMON process clean-up interval (cs) 50
alter system set "_PKT_PMON_INTERVAL"=5;
于是metalink和google到以下一些资料:
Removing Sessions in Killed Status on Unix [ID 274216.1]
ALTER SYSTEM KILL Session Marked for Killed Forever [ID 1020720.102]
KILLING INACTIVE SESSIONS DOES NOT REMOVE SESSION ROW FROM V$SESSION [ID 1041427.6]
ALTER SYSTEM KILL SESSION does not Release Locks Killing a Thread on Windows NT [ID 100859.1]
http://blog.csdn.net/tianlesoftware/article/details/7417058
http://www.eygle.com/faq/Kill_Session.htm
---比较有用的
How To Find The Process Identifier (pid, spid) After The Corresponding Session Is Killed? [ID 387077.1]
HOW TO HAVE ORACLE CLEAN-UP OLD USER INFO AFTER KILLING SESSION UNDER MTS Note:1023442.6
项目 | primary db |
db 类型 | 单实例 |
db version | 11.2.0.3.0 |
db 存储 | ASM |
主机IP地址/hosts配置 | 192.168.59.129 |
OS版本及kernel版本 | rhel 6.5 |
实验序号 | 实验内容 |
1 | 设置用户profile的idle_time 参数 |
2 | kill session的时候加immediate和不加的区别 |
3 | 授予普通用户kill自己用户的权限 |
4 | KILLED状态的会话如何找到相关的SPID |
可以参考:
http://blog.csdn.net/leshami/article/details/9184917
http://blog.csdn.net/tianlesoftware/article/details/6238279
设置resource_limit 为true,该参数默认为false。
[oracle@orcltest ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Sun Jun 26 17:55:53 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> show parameter RESOURCE_LIMIT
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_limit boolean FALSE
SQL> alter system set resource_limit=true;
System altered.
为业务用户创建profile文件。然后把该配置文件赋给业务用户。
SQL> create profile pro_lhr limit idle_time 1;
Profile created.
SQL> alter user lhr profile pro_lhr;
User altered.
SQL>
SQL> set line 9999 pagesize 9999
SQL> select * from dba_profiles where profile='PRO_LHR';
PROFILE RESOURCE_NAME RESOURCE LIMIT
------------------------------ -------------------------------- -------- ----------------------------------------
PRO_LHR COMPOSITE_LIMIT KERNEL DEFAULT
PRO_LHR SESSIONS_PER_USER KERNEL DEFAULT
PRO_LHR CPU_PER_SESSION KERNEL DEFAULT
PRO_LHR CPU_PER_CALL KERNEL DEFAULT
PRO_LHR LOGICAL_READS_PER_SESSION KERNEL DEFAULT
PRO_LHR LOGICAL_READS_PER_CALL KERNEL DEFAULT
PRO_LHR IDLE_TIME KERNEL 1
PRO_LHR CONNECT_TIME KERNEL DEFAULT
PRO_LHR PRIVATE_SGA KERNEL DEFAULT
PRO_LHR FAILED_LOGIN_ATTEMPTS PASSWORD DEFAULT
PRO_LHR PASSWORD_LIFE_TIME PASSWORD DEFAULT
PRO_LHR PASSWORD_REUSE_TIME PASSWORD DEFAULT
PRO_LHR PASSWORD_REUSE_MAX PASSWORD DEFAULT
PRO_LHR PASSWORD_VERIFY_FUNCTION PASSWORD DEFAULT
PRO_LHR PASSWORD_LOCK_TIME PASSWORD DEFAULT
PRO_LHR PASSWORD_GRACE_TIME PASSWORD DEFAULT
16 rows selected.
SQL>
启动一个会话,等待一分钟
D:/Users/xiaomaimiao>sqlplus lhr/lhr@192.168.59.129/oratest
SQL*Plus: Release 11.2.0.1.0 Production on Sun Jun 26 18:03:09 2016
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
LHR@192.168.59.129/oratest> set time on
18:03:12 LHR@192.168.59.129/oratest> SELECT a.SID,
18:03:37 2 b.SERIAL# ,
18:03:37 3 c.SPID,
18:03:37 4 b.status
18:03:37 5 FROM v$mystat a,
18:03:37 6 v$session b ,
18:03:37 7 v$process c
18:03:37 8 WHERE a.SID = b.SID
18:03:37 9 and b.PADDR=c.ADDR
18:03:37 10 AND rownum = 1;
SID SERIAL# SPID STATUS
---------- ---------- ------------------------ --------
19 9 14689 ACTIVE
1分钟后在其它会话窗口查询:
SQL> SELECT b.SID,
2 b.SERIAL# ,
3 c.SPID,
4 b.status
5 FROM v$session b ,
6 v$process c
7 WHERE b.PADDR=c.ADDR
8 AND b.sid=19;
SID SERIAL# SPID STATUS
---------- ---------- ------------------------ --------
19 9 14689 INACTIVE
SQL> /
SID SERIAL# SPID STATUS
---------- ---------- ------------------------ --------
19 9 14689 SNIPED
SQL>
SQL> alter system kill session '19,9' immediate;
System altered.
SQL> SELECT b.SID,
2 b.SERIAL# ,
3 c.SPID,
4 b.status
5 FROM v$session b ,
6 v$process c
7 WHERE b.PADDR=c.ADDR
8 AND b.sid=19;
no rows selected
SQL>
创建普通用户lhrtest,授予resource和connect权限。
SQL> create user lhrtest identified by lhrtest;
User created.
SQL> grant resource ,connect to lhrtest;
Grant succeeded.
使用sys用户来创建需要的脚本:
SQL> create or replace view vw_myownersession_lhr
2 as
3 select * from v$session where username = USER;
View created.
SQL> create or replace public synonym syn_myownersession_lhr for sys.vw_myownersession_lhr;
Synonym created.
SQL> create or replace procedure pro_kill_myown_session_lhr( p_sid in varchar2,p_serial# in varchar2)
2 is
3 cursor_name pls_integer default dbms_sql.open_cursor;
4 ignore pls_integer;
5 BEGIN
6 select count(*) into ignore
7 from v$session
8 where username = USER
9 and sid = p_sid
10 and serial# = p_serial# ;
11
12 if ( ignore = 1 )
13 then
14 dbms_sql.parse(cursor_name,'alter system disconnect session '''||p_sid||','||p_serial#||''' immediate',dbms_sql.native);
15 ignore := dbms_sql.execute(cursor_name);
16 else
17 raise_application_error( -20001,'You do not own session ''' ||p_sid || ',' || p_serial# ||'''' );
18 end if;
19 END pro_kill_myown_session_lhr;
20 /
Procedure created.
SQL> create or replace public synonym pro_kill_session_lhr for sys.pro_kill_myown_session_lhr;
Synonym created.
SQL> grant select on syn_myownersession_lhr to lhrtest;
Grant succeeded.
SQL> grant execute on pro_kill_session_lhr to lhrtest;
Grant succeeded.
SQL>
用windows客户端登录一个会话:
D:/Users/xiaomaimiao>sqlplus lhrtest/lhrtest@192.168.59.129/oratest
SQL*Plus: Release 11.2.0.1.0 Production on Sun Jun 26 19:19:42 2016
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
LHRTEST@192.168.59.129/oratest> SELECT USERENV('SID') FROM DUAL;
USERENV('SID')
--------------
19
LHRTEST@192.168.59.129/oratest> select sid,serial#,paddr,status from syn_myownersession_lhr where sid=19;
SID SERIAL# PADDR STATUS
---------- ---------- ---------------- --------
19 15 0000000077C9B870 ACTIVE
不要关闭19,15窗口,然后重新开一个会话窗口:
SQL> conn lhrtest/lhrtest
Connected.
SQL> show user
USER is "LHRTEST"
SQL> select sid,serial#,paddr,status from syn_myownersession_lhr where sid=19;
SID SERIAL# PADDR STATUS
---------- ---------- ---------------- --------
19 15 0000000077C9B870 INACTIVE
SQL> alter system kill session '19,15' immediate;
alter system kill session '19,15' immediate
*
ERROR at line 1:
ORA-01031: insufficient privileges
SQL> exec pro_kill_session_lhr(19,15);
PL/SQL procedure successfully completed.
SQL> select sid,serial#,paddr,status from syn_myownersession_lhr where sid=19;
no rows selected
SQL>
可以看到普通用户也可以杀掉自己用户的会话了。
kill session 的测试:
SQL> set line 9999
SQL> col sessionid format a20
SQL> col sessionid_killed format a20
SQL> col kill_session format a60
SQL>
SQL> SELECT a.INST_ID,
2 a.SID || ',' || a.SERIAL# || ',' ||
3 (select spid
4 from gv$process b
5 where b.INST_ID = a.INST_ID
6 and A.creator_addr = b.ADDR --and decode(a.status,'KILLED',A.creator_addr,A.PADDR) = b.ADDR
7 ) sessionid,
8 a.PADDR,
9 a.STATUS,
10 a.PROGRAM,
11 a.server,
12 'alter system disconnect session ''' || sid || ',' || serial# || ''' immediate;' kill_session
13 FROM gv$session a
14 WHERE a.type != 'BACKGROUND';
INST_ID SESSIONID PADDR STATUS PROGRAM SERVER KILL_SESSION
---------- -------------------- ---------------- -------- ---------------------------------------- --------- ------------------------------------------------------------
1 9,169,14901 0000000077C9B870 INACTIVE sqlplus.exe DEDICATED alter system disconnect session '9,169' immediate;
1 20,9,14891 0000000077CA5F50 INACTIVE plsqldev32.exe DEDICATED alter system disconnect session '20,9' immediate;
1 23,35,14885 0000000077C99710 INACTIVE sqlplus.exe DEDICATED alter system disconnect session '23,35' immediate;
1 125,7,14873 0000000077C98660 ACTIVE sqlplus@orcltest (TNS V1-V3) DEDICATED alter system disconnect session '125,7' immediate;
1 145,23,14651 0000000077CA9160 INACTIVE plsqldev32.exe DEDICATED alter system disconnect session '145,23' immediate;
SQL> alter system kill session '9,169';
System altered.
SQL> alter system kill session '20,9';
System altered.
SQL> set line 9999
SQL> col sessionid format a20
SQL> col sessionid_killed format a20
SQL> col kill_session format a60
SQL>
SQL> SELECT a.INST_ID,
2 a.SID || ',' || a.SERIAL# || ',' ||
3 (select spid
4 from gv$process b
5 where b.INST_ID = a.INST_ID
6 and A.creator_addr = b.ADDR --and decode(a.status,'KILLED',A.creator_addr,A.PADDR) = b.ADDR
7 ) sessionid,
8 a.PADDR,
9 a.STATUS,
10 a.PROGRAM,
11 a.server,
12 'alter system disconnect session ''' || sid || ',' || serial# || ''' immediate;' kill_session
13 FROM gv$session a
14 WHERE a.type != 'BACKGROUND';
INST_ID SESSIONID PADDR STATUS PROGRAM SERVER KILL_SESSION
---------- -------------------- ---------------- -------- ---------------------------------------- --------- ------------------------------------------------------------
1 9,169,14901 0000000077D2DCF8 KILLED sqlplus.exe PSEUDO alter system disconnect session '9,169' immediate;
1 20,9,14891 0000000077D2DCF8 KILLED plsqldev32.exe PSEUDO alter system disconnect session '20,9' immediate;
1 23,35,14885 0000000077C99710 INACTIVE sqlplus.exe DEDICATED alter system disconnect session '23,35' immediate;
1 125,7,14873 0000000077C98660 ACTIVE sqlplus@orcltest (TNS V1-V3) DEDICATED alter system disconnect session '125,7' immediate;
1 145,23,14651 0000000077CA9160 INACTIVE plsqldev32.exe DEDICATED alter system disconnect session '145,23' immediate;
SQL>
可以看到,杀掉的2个会话在v$session中都可以查到,只是①其status变为了KILLED,②server列变为了PSEUDO,③paddr列都变为了一样的了,因此这个时候如若还使用paddr列来关联process列必然查询不到spid号了,这个时候可以使用前边我们介绍的几种SQL来查询会话的spid,然后用kill -9杀掉会话。
我们用kill -9杀掉会话,等待后台PMON来自动清理进程,若是PMON很慢,我们可以手动来用oradebug wakeup 2来唤醒PMON进程,还可以设置PMON的清理间隔alter system set "_PKT_PMON_INTERVAL"=5;:
[oracle@orcltest ~]$ ps -ef|grep 14901
oracle 14901 1 0 19:51 ? 00:00:00 oracleoratest (LOCAL=NO)
oracle 14959 14625 0 20:17 pts/8 00:00:00 grep 14901
[oracle@orcltest ~]$ kill -9 14901
[oracle@orcltest ~]$ ps -ef|grep 14901
oracle 14961 14625 0 20:17 pts/8 00:00:00 grep 14901
[oracle@orcltest ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Sun Jun 26 20:17:54 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> set line 9999
SQL> col sessionid format a20
SQL> col sessionid_killed format a20
SQL> col kill_session format a60
SQL>
SQL> SELECT a.INST_ID,
2 a.SID || ',' || a.SERIAL# || ',' ||
3 (select spid
4 from gv$process b
5 where b.INST_ID = a.INST_ID
6 and A.creator_addr = b.ADDR --and decode(a.status,'KILLED',A.creator_addr,A.PADDR) = b.ADDR
7 ) sessionid,
8 a.PADDR,
9 a.STATUS,
10 a.PROGRAM,
11 a.server,
12 'alter system disconnect session ''' || sid || ',' || serial# || ''' immediate;' kill_session
13 FROM gv$session a
14 WHERE a.type != 'BACKGROUND';
INST_ID SESSIONID PADDR STATUS PROGRAM SERVER KILL_SESSION
---------- -------------------- ---------------- -------- ------------------------------------------------ ----------- ---------------------------------------------------------
1 9,169,14901 0000000077D2DCF8 KILLED sqlplus.exe PSEUDO alter system disconnect session '9,169' immediate;
1 20,9,14891 0000000077D2DCF8 KILLED plsqldev32.exe PSEUDO alter system disconnect session '20,9' immediate;
1 23,35,14885 0000000077C99710 INACTIVE sqlplus.exe DEDICATED alter system disconnect session '23,35' immediate;
1 125,9,14964 0000000077C98660 ACTIVE sqlplus@orcltest (TNS V1-V3) DEDICATED alter system disconnect session '125,9' immediate;
SQL> select INST_ID, spid, program,A.PNAME,A.PID
2 from gv$process a
3 where a.PNAME='PMON';
INST_ID SPID PROGRAM PNAME PID
---------- ---------- ---------------------------------------- ----- ----------
1 13955 oracle@orcltest (PMON) PMON 2
SQL> oradebug wakeup 2
Statement processed.
SQL>
SQL> SET LINESIZE 180
SQL> COLUMN spid FORMAT A10
SQL> COLUMN username FORMAT A10
SQL> COLUMN program FORMAT A40
SQL> SELECT s.inst_id,
2 s.sid,
3 s.serial#,
4 p.spid,
5 s.username,
6 s.program,
7 s.paddr,
8 s.STATUS,
9 s.server
10 FROM gv$session s
11 left outer JOIN gv$process p
12 ON p.addr = s.paddr
13 AND p.inst_id = s.inst_id
14 WHERE s.type != 'BACKGROUND';
INST_ID SID SERIAL# SPID USERNAME PROGRAM PADDR STATUS SERVER
---------- ---------- ---------- ---------- ---------- ---------------------------------------- ---------------- -------- ---------
1 125 9 14964 SYS sqlplus@orcltest (TNS V1-V3) 0000000077C98660 ACTIVE DEDICATED
1 23 35 14885 SYS sqlplus.exe 0000000077C99710 INACTIVE DEDICATED
1 20 11 14966 SYS plsqldev32.exe 0000000077C9B870 INACTIVE DEDICATED
1 9 177 14968 SYS plsqldev32.exe 0000000077CA5F50 INACTIVE DEDICATED
SQL>
kill session immediate的测试:
SQL> set line 9999
SQL> col sessionid format a20
SQL> col sessionid_killed format a20
SQL> col kill_session format a60
SQL>
SQL> SELECT a.INST_ID,
2 a.SID || ',' || a.SERIAL# || ',' ||
3 (select spid
4 from gv$process b
5 where b.INST_ID = a.INST_ID
6 and A.creator_addr = b.ADDR --and decode(a.status,'KILLED',A.creator_addr,A.PADDR) = b.ADDR
7 ) sessionid,
8 a.PADDR,
9 a.STATUS,
10 a.PROGRAM,
11 a.server,
12 'alter system disconnect session ''' || sid || ',' || serial# || ''' immediate;' kill_session
13 FROM gv$session a
14 WHERE a.type != 'BACKGROUND';
INST_ID SESSIONID PADDR STATUS PROGRAM SERVER KILL_SESSION
---------- -------------------- ---------------- -------- ---------------------------------------- --------- ------------------------------------------------------------
1 9,169,14901 0000000077D2DCF8 KILLED sqlplus.exe PSEUDO alter system disconnect session '9,169' immediate;
1 20,9,14891 0000000077D2DCF8 KILLED plsqldev32.exe PSEUDO alter system disconnect session '20,9' immediate;
1 23,35,14885 0000000077C99710 INACTIVE sqlplus.exe DEDICATED alter system disconnect session '23,35' immediate;
1 125,7,14873 0000000077C98660 ACTIVE sqlplus@orcltest (TNS V1-V3) DEDICATED alter system disconnect session '125,7' immediate;
1 145,23,14651 0000000077CA9160 INACTIVE plsqldev32.exe DEDICATED alter system disconnect session '145,23' immediate;
SQL> alter system kill session '145,23' immediate;
System altered.
SQL> set line 9999
SQL> col sessionid format a20
SQL> col sessionid_killed format a20
SQL> col kill_session format a60
SQL>
SQL> SELECT a.INST_ID,
2 a.SID || ',' || a.SERIAL# || ',' ||
3 (select spid
4 from gv$process b
5 where b.INST_ID = a.INST_ID
6 and A.creator_addr = b.ADDR --and decode(a.status,'KILLED',A.creator_addr,A.PADDR) = b.ADDR
7 ) sessionid,
8 a.PADDR,
9 a.STATUS,
10 a.PROGRAM,
11 a.server,
12 'alter system disconnect session ''' || sid || ',' || serial# || ''' immediate;' kill_session
13 FROM gv$session a
14 WHERE a.type != 'BACKGROUND';
INST_ID SESSIONID PADDR STATUS PROGRAM SERVER KILL_SESSION
---------- -------------------- ---------------- -------- ---------------------------------------- --------- ------------------------------------------------------------
1 9,169,14901 0000000077D2DCF8 KILLED sqlplus.exe PSEUDO alter system disconnect session '9,169' immediate;
1 20,9,14891 0000000077D2DCF8 KILLED plsqldev32.exe PSEUDO alter system disconnect session '20,9' immediate;
1 23,35,14885 0000000077C99710 INACTIVE sqlplus.exe DEDICATED alter system disconnect session '23,35' immediate;
1 125,7,14873 0000000077C98660 ACTIVE sqlplus@orcltest (TNS V1-V3) DEDICATED alter system disconnect session '125,7' immediate;
SQL>
可以看到若加上immediate的话会话没有事务的情况下会立即释放,且v$session视图也被清理了。
About Me
..........................................................................................................................................................................................................
本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
本文在ITpub(http://blog.itpub.net/26736162)和博客园(http://www.cnblogs.com/lhrbest)有同步更新
本文地址:http://blog.itpub.net/26736162/viewspace-2121019/和http://blog.itpub.net/26736162/viewspace-2121020/
本文pdf版:http://yunpan.cn/cdEQedhCs2kFz (提取码:ed9b)
小麦苗分享的其它资料:http://blog.itpub.net/26736162/viewspace-1624453/
联系我请加QQ好友(642808185),注明添加缘由
于 2016-06-15 10:00~ 2016-06-26 19:00 在中行完成
【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】
..........................................................................................................................................................................................................