2008-10-10 5 views
8

Tôi không có DBA, và tôi đang có một chút khó khăn trong việc hiểu quy trình quản lý giao dịch của Oracle.Oracle - Giao dịch, phân đoạn rollback và thông số undo_retention hoạt động như thế nào?

Từ những gì tôi hiểu bằng cách đọc một số trang đáng tin cậy trên Internet (đáng chú ý nhất là AskTom note - nhưng đừng bận tâm với nhận xét), khi giao dịch được cam kết, dữ liệu mới là không được báo cáo khối dữ liệu thực tế, nhưng vẫn đăng nhập vào phân đoạn rollback. Khi ai đó phát hành SELECT trên dữ liệu hoặc sau khi UNDO_RETENTION giây trôi qua - bất kỳ sự kiện nào trong hai sự kiện này xảy ra trước - thì dữ liệu mới sau đó được (và chỉ sau đó) được ghi trên các khối dữ liệu.

Nhưng một người nào đó trong công ty chúng tôi cho rằng ngược lại: theo ông, khi giao dịch được cam kết, dữ liệu mới ngay lập tức được ghi trên khối dữ liệu và phân đoạn rollback/hoàn tác không gian bảng lưu giữ dữ liệu cũ trong thời lượng UNDO_RETENTION giây. Dữ liệu cũ này vẫn có sẵn trong thời gian này để truy cập bằng truy vấn được khởi chạy trên SCN trước giao dịch.

Vì vậy, những gì thực sự xảy ra bên trong Oracle và bạn có thể cung cấp tham chiếu để sao lưu câu trả lời của mình không?

Chúng tôi đang sử dụng Oracle 9.2.0.8.

Xin cảm ơn trước.

Trả lời

13

Rất nhiều trang trải tại đây! Người trong công ty của bạn về cơ bản là đúng, ngoại trừ các thay đổi được ghi vào khối dữ liệu trong bộ nhớ khi chúng được tạo, ngay cả trước khi thực hiện cam kết; và chúng được ghi ra đĩa hoàn toàn độc lập khi bạn cam kết (có thể trước, có thể sau, không bao giờ là một phần của hoạt động cam kết).

1) UNDO_RETENTION không có gì liên quan khi các thay đổi của bạn được ghi vào khối dữ liệu, trong bộ nhớ hoặc trên đĩa. UNDO_RETENTION kiểm soát thời gian dữ liệu cần thiết để hoàn tác thay đổi của bạn vẫn còn SAU KHI bạn thực hiện thay đổi. Mục đích là các truy vấn khác hoặc các giao dịch tuần tự được bắt đầu trước khi cam kết của bạn có thể vẫn muốn dữ liệu đó. Tham khảo: http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/undo.htm#sthref1477

2) Khi bạn cập nhật, các khối dữ liệu trong bộ nhớ được sửa đổi.Họ có thể hoặc không thể được ghi ra đĩa (ngay cả trước khi bạn cam kết, tôi tin); điều này được thực hiện bởi một quá trình nền. Ngoài ra, làm lại thông tin được ghi vào bộ đệm đăng nhập làm lại. Hoàn tác được tạo và lưu trữ trong một đoạn hoàn tác.

3) Khi bạn cam kết, Oracle đảm bảo rằng thông tin làm lại của bạn được ghi vào đĩa và đánh dấu dữ liệu hoàn tác như đã cam kết. Nhưng nó không viết các khối dữ liệu đã thay đổi trong bộ nhớ vào đĩa, cũng không quay trở lại và đánh dấu từng khối như đã cam kết. Điều này là để thực hiện cam kết càng nhanh càng tốt. Tham khảo: http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/transact.htm#sthref628

4) Các khối dữ liệu trong bộ nhớ sẽ được đánh dấu là đã cam kết khi chúng được ghi vào đĩa theo quy trình nền hoặc lần sau chúng được sử dụng (bằng cách chọn SELECT hoặc bất kỳ thao tác nào khác). Đó là những gì mà lưu ý AskTom đang thảo luận. Đây không phải là liệu các thay đổi của bạn đối với dữ liệu có được ghi vào khối hay không; đó là về việc liệu chúng có được đánh dấu là đã cam kết trong chính khối đó hay không.

+0

Cảm ơn câu trả lời đầy đủ này. – Manur

+2

Có, bạn nói đúng rằng các khối bẩn có thể được ghi vào đĩa trước khi cam kết xảy ra. Đây là lý do tại sao một phát biểu SELECT có thể tạo lại - nó có thể cần phải thực hiện một "chậm khối làm sạch". Phần quan trọng là cam kết chỉ đảm bảo rằng làm lại được ghi vào đĩa - không phải chính dữ liệu. –

0

Sự hiểu biết của tôi là (về cơ bản) sau này, This link có các chi tiết.

Các khối dữ liệu không cần phải được viết, chỉ cần cập nhật trong bộ đệm, chúng có thể hoặc không được ghi ra đĩa. Các làm lại phải được ghi vào đĩa trước khi cam kết có thể tiến hành mặc dù.

0

Tôi cũng bỏ phiếu cho phiên bản thứ hai dựa trên
link này (đó là Oracle 10.2, nhưng tôi nghĩ rằng nó vẫn áp dụng cho 9.2).

Nó nói: "Sau khi giao dịch được cam kết, hoàn tác dữ liệu không còn cần thiết cho mục đích khôi phục hoặc phục hồi giao dịch. Tuy nhiên, vì mục đích đọc ổn định, truy vấn dài hạn có thể yêu cầu thông tin hoàn tác cũ này để tạo ra hình ảnh cũ hơn khối dữ liệu. "

"Khi quản lý undo tự động được kích hoạt, luôn luôn có một thời gian lưu giữ undo hiện nay, đó là số tiền tối thiểu thời gian mà Oracle Database cố gắng để giữ lại tuổi undo thông tin trước khi ghi đè lên nó."