Tại sao không XÓA + REORG không gian đĩa miễn phí (DB2)?


18

Trong DB2 tôi có một bảng chứa dữ liệu nhị phân lớn. Bây giờ tôi đã thanh trừng toàn bộ bảng và chạy runstats, reorg, runstats, nhưng dung lượng đĩa được lấy không thay đổi. Điều gì có thể sai ở đây?

Bảng nằm trong không gian bảng riêng mà tôi đã tạo như sau:

CREATE BUFFERPOOL "MY_BP" SIZE 250 AUTOMATIC PAGESIZE 4096;
CREATE LARGE TABLESPACE MY_TBS IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 4096 MANAGED BY AUTOMATIC STORAGE EXTENTSIZE 64 PREFETCHSIZE 64 BUFFERPOOL MY_BP OVERHEAD 10.500000 TRANSFERRATE 0.140000 FILE SYSTEM CACHING;

Tôi đã xóa / reorged như sau:

DELETE FROM MY_TBL
RUNSTATS ON TABLE MY_TBL WITH DISTRIBUTION AND DETAILED INDEXES ALL
REORG TABLE MY_TBL
RUNSTATS ON TABLE MY_TABLE WITH DISTRIBUTION AND DETAILED INDEXES ALL
ALTER TABLESPACE MY_TBS REDUCE

Bảng MY_TBL đã chiếm 2,5 GB trước tất cả những điều đó và sau khi xóa / sắp xếp lại, nó chỉ sử dụng ít hơn 3 MB .

FWIW: Tôi đang chạy DB2 / NT v9.5.2.


Điều này có hoạt động cho các hệ thống trên db2 v8 không?
Tony

Câu trả lời:


22

Tôi sẽ đoán rằng bạn đang sử dụng lưu trữ tự động. (Không phải điều này có thể xảy ra nếu không ... thật dễ dàng để điều này xảy ra với lưu trữ tự động.)

Vấn đề rất có thể là cơ sở dữ liệu của bạn đã lấy lại không gian cho chính nó nhưng không giải phóng đĩa trở lại hệ điều hành. Điều này có thể được hiển thị rất dễ dàng bằng cách kiểm tra High Water Mark cho không gian bảng.

Làm như sau

db2 list tablespaces show detail

Điều này sẽ cho bạn thấy từng không gian bảng và những gì nó đang sử dụng trên đĩa. Used pageslà bao nhiêu trang đĩa cơ sở dữ liệu đang sử dụng. So sánh điều đó với total pages(tổng số yêu cầu trên đĩa) và High water mark (pages)sẽ cho bạn biết nếu bạn "yêu cầu" nhiều hơn bạn thực sự cần. (nghĩa là các trang được sử dụng thấp, tổng số trang rất cao và Dấu nước cao gần với tổng số trang).

Để thoát khỏi không gian không sử dụng này và trả lại cho hệ điều hành, bạn sẽ đưa ra các điều sau (dưới bộ nhớ tự động) : db2 alter tablespace <tablespace name> reduce max. thí dụ

db2 alter tablespace ts1 reduce max;

Điều đó sẽ khiến cho DB2 hạ thấp mức nước cao và giải phóng đĩa không sử dụng trở lại hệ điều hành. (Lưu ý bạn chỉ có thể làm điều này cho các không gian bảng thông thường và lớn, không dành cho tạm thời hệ thống hoặc không gian bảng tạm thời của người dùng).

Nếu bạn đang sử dụng DMS mà không có bộ nhớ tự động, bạn cần sử dụng một nhóm lệnh hơi khác:

db2 alter tablespace <tablespace name> lower high water mark;
db2 alter tablespace reduce (<containter name> or [all containers] integer K|M|G or integer PERCENT);

thí dụ

db2 alter tablespace ts1 lower high water mark;
db2 alter tablespace reduce (all containers 500 M);

Khi chúng tôi làm việc, chúng tôi đưa phần này vào một số tập lệnh bảo trì để chúng tôi tự động chạy phần này sau khi chúng tôi thực hiện lại để đảm bảo chúng tôi lấy lại dung lượng đĩa. Trong trường hợp của chúng tôi, chúng tôi sử dụng DB2 LUW 9.7 FP 4, do đó, không cần kiểm tra kỹ Trung tâm thông tin cho 9.5 để đảm bảo bạn có quyền truy cập vào thông tin phù hợp cho phiên bản của mình.

EDIT: Nếu không gian bảng của bạn đến từ cơ sở dữ liệu được nâng cấp lên DB2 9.7, có lẽ bạn sẽ không có bộ thuộc tính lưu trữ có thể thu hồi được. Điều này đúng ngay cả khi bạn nâng cấp từ DMS lên bộ nhớ tự động. Dù bằng cách nào, bạn cũng có thể thực sự hạ thấp vạch nước cao. Bạn phải đổ bảng và dữ liệu ra, thả các không gian bảng. Sau đó, tạo lại không gian bảng bằng cách sử dụng lưu trữ tự động và nhập dữ liệu cho các bảng của bạn.


+1 - thật tốt khi thấy một chuyên gia DB2 đóng góp cho trang web. Chúng tôi đã yếu trong lĩnh vực đó trong quá khứ.
Philᵀᴹ

1
Chỉ cần một nhận xét nhanh, trong DB2 9.5, bạn không thể sử dụng cú pháp alter tablespace <tbsp> lower high watermarkhoặc alter tablespace <tbsp> reduce maxcú pháp - những điều này không được giới thiệu cho đến DB2 9.7.
Ian Bjorhovde

Như tôi đã đề cập trong bài viết ban đầu của mình, tôi đã thử hầu hết điều đó và nó đã không thành công. Đến bây giờ tôi đã tự tìm ra giải pháp: Không thể lấy lại dung lượng ổ đĩa vì tôi không chỉ định tùy chọn LONGLOBDATA, điều này dường như là cần thiết nếu bạn muốn lấy lại dung lượng đĩa từ BLOB hoặc CLOB. Xin vui lòng xem câu trả lời của tôi cho câu hỏi của riêng tôi ở đây. Dù sao, tôi đánh giá cao nỗ lực bạn đưa vào câu trả lời của bạn, +1!
Alexander Tobias Bockstaller

9

Bảng MY_TBLchứa dữ liệu nhị phân lớn trong một BLOBcột. Tài liệu của REORGlệnh nói rằng DB2 tránh tổ chức lại các đối tượng như vậy bởi vì nó tốn thời gian và không cải thiện việc phân cụm. Tuy nhiên, DB2 có thể bị buộc phải tổ chức lại dữ liệu LOB nếuLONGLOBDATA tùy chọn được chỉ định. Không gian chưa sử dụng có thể được sử dụng lại bởi DB2, do đó, việc chèn dữ liệu mới trước tiên sẽ lấp đầy các trang hiện có, chưa sử dụng trước khi phân bổ mới.

Đang chạy

REORG TABLE MY_TBL LONGLOBDATA

lấy lại thành công 2,5 GB dung lượng đĩa mà bảng trống đang sử dụng.

Tôi không biết về tùy chọn này và giám sát nó lần đầu tiên khi tôi đọc tài liệu.


Điểm tốt. Tuy nhiên, từ những gì tôi vừa học được trong tập "Tấn công của Blob" của DB2NightShow, bạn không muốn chạy tùy chọn LONGLOBDATA quá thường xuyên vì nó mất nhiều thời gian hơn và / hoặc gây ra các vấn đề về hiệu suất (nếu bạn đang cố gắng thực hiện REORG trực tuyến) .
Chris Aldrich

Các cơ sở dữ liệu chúng ta đang xử lý chứa dữ liệu nhật ký từ các máy công nghiệp. Các truy vấn đối với các cơ sở dữ liệu như vậy không phải là vấn đề quan trọng về thời gian, vì vậy nếu hiệu suất giảm trong quá trình reorg, đây không phải là vấn đề.
Alexander Tobias Bockstaller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.