2008-09-17 28 views
53

Có cách nào tốt hơn để ngắt kết nối tất cả người dùng khỏi lược đồ cơ sở dữ liệu Oracle 10g hơn khởi động lại các dịch vụ cơ sở dữ liệu Oracle không?Rời một người dùng được kết nối từ một lược đồ cơ sở dữ liệu Oracle 10g

Chúng tôi có một số nhà phát triển sử dụng SQL Developer kết nối với cùng một lược đồ trên một máy chủ Oracle 10g duy nhất. Vấn đề là khi chúng ta muốn bỏ lược đồ để xây dựng lại nó, chắc chắn ai đó vẫn còn kết nối và chúng ta không thể bỏ lược đồ cơ sở dữ liệu hoặc người dùng trong khi ai đó vẫn còn kết nối.

Bằng cùng một mã thông báo, chúng tôi không muốn bỏ tất cả các kết nối đến các lược đồ khác vì những người khác vẫn có thể được kết nối và thử nghiệm với các lược đồ đó.

Bất kỳ ai biết cách nhanh chóng để giải quyết vấn đề này?

Trả lời

97

Để tìm phiên, như việc sử dụng DBA

select sid,serial# from v$session where username = '<your_schema>'

Nếu bạn muốn trở thành chỉ chắc chắn để có được phiên sử dụng SQL Developer, bạn có thể thêm and program = 'SQL Developer'. Nếu bạn chỉ muốn giết phiên thuộc về một nhà phát triển cụ thể, bạn có thể thêm một hạn chế về os_user

Sau đó giết họ với

alter system kill session '<sid>,<serial#>'

(ví dụ alter system kill session '39,1232')

Một truy vấn tạo các câu lệnh giết sẵn được xây dựng có thể là

select 'alter system kill session ''' || sid || ',' || serial# || ''';' from v$session where username = '<your_schema>'

này sẽ trả lại một tuyên bố giết mỗi phiên cho người dùng đó - một cái gì đó như:

alter system kill session '375,64855';

alter system kill session '346,53146';

+0

tôi thấy rằng trong môi trường RAC của chúng tôi, giết chết kỳ họp thường để nó treo, nhưng tìm hiểu quá trình id và giết chết nó từ hệ điều hành luôn luôn làm việc . – Jonathan

+4

bổ sung nhỏ - thêm ngay lập tức vào lệnh: 'chọn 'thay đổi phiên giết hệ thống' '' || sid || ',' || serial # || '' 'ngay lập tức;' từ v $ session trong đó username = ''; 'điều này sẽ buộc lệnh – Michael

+0

câu trả lời hay. Chính xác những gì tôi đang tìm kiếm. –

0

Bạn đã thử ALTER SYSTEM KILL SESSION chưa? Lấy SID và SERIAL # từ V $ SESSION cho mỗi phiên trong lược đồ nhất định, sau đó làm

ALTER SCHEMA KILL PHIÊN sid, serial #;

0

Chỉ cần hai xu của tôi: cách tốt nhất (nhưng có lẽ không nhanh nhất trong ngắn hạn) có thể là để mỗi nhà phát triển làm việc trên cá thể cơ sở dữ liệu của chính mình (xem rule #1 for database work).

Cài đặt Oracle trên một trạm phát triển đã trở thành không có trí tuệ kể từ Oracle Database 10g Express Edition.

+0

Chỉ dành cho Windows và một số hương vị nhất định của Linux. –

+0

Điều đó không thực sự liên quan đến câu hỏi? – Konrads

+0

Đó có thể không phải là câu trả lời mà người hỏi đang tìm kiếm và tôi hoàn toàn có thể hiểu tại sao nó không được bình chọn rất nhiều, nhưng tôi nghĩ nó rất phù hợp khi xem xét trường hợp sử dụng mà anh ta đưa ra. Nhiều nhà phát triển làm việc trên cùng một cơ sở dữ liệu là một ý tưởng rất tồi, và vấn đề này chắc chắn không phải là điều tồi tệ nhất sẽ xảy ra. – Mac

1

Đảm bảo rằng bạn thay đổi hệ thống và bật phiên bị hạn chế trước khi bạn giết chúng hoặc chúng sẽ nhanh chóng đăng nhập lại vào cơ sở dữ liệu trước khi bạn hoàn thành công việc.

+2

Có thể dễ dàng hơn và ít xâm nhập hơn, để khóa người dùng mà anh dự định thả, sau đó xóa tất cả các phiên được kết nối trên người dùng đó, sau đó thả nó và tạo lại. Không cần phải hạn chế quyền truy cập không cần thiết đối với người dùng khác. –

1

chỉ cần sử dụng SQL:

disconnect; 

conn tiger/scott as sysdba; 
15

Tìm phiên hiện có để DB sử dụng truy vấn này:

SELECT s.inst_id, 
     s.sid, 
     s.serial#, 
     p.spid, 
     s.username, 
     s.program 
FROM gv$session s 
     JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id 
WHERE s.type != 'BACKGROUND'; 

bạn sẽ thấy một cái gì đó như dưới đây. Oracle Sessions

Sau đó, chạy bên dưới truy vấn với các giá trị được trích xuất từ ​​kết quả ở trên.

ALTER SYSTEM KILL SESSION '<put above s.sid here>,<put above s.serial# here>'; 

Ex: ALTER SYSTEM KILL PHIÊN '93, 943' ;

7

đề nghị của tôi là thế này khối ẩn danh đơn giản:

DECLARE 
    lc_username VARCHAR2 (32) := 'your user name here'; 
BEGIN 
    FOR ln_cur IN (SELECT sid, serial# FROM v$session WHERE username = lc_username) 
    LOOP 
     EXECUTE IMMEDIATE ('ALTER SYSTEM KILL SESSION ''' || ln_cur.sid || ',' || ln_cur.serial# || ''' IMMEDIATE'); 
    END LOOP; 
END; 
/
+1

tốt hơn để lưu ý ospid trước khi giết chết phiên, họ có thể bị mắc kẹt – user3380585

Các vấn đề liên quan