Viết một kịch bản sẽ tạo ra một kịch bản
MYSQL_CONN="-hAmazonRDSDNSName -u... -p..."
SQL="SELECT CONCAT('OPTIMIZE TABLE ',table_schema,'.',table_name,';')"
SQL="${SQL} OptimizeTableSQL FROM information_schema.tables WHERE table_schema = 'signs'"
SQL="${SQL} ORDER BY (data_length+index_length)"
mysql ${MYSQL_CONN} -AN -e"${SQL}" > /root/OptimizeAllTables.sql
less /root/OptimizeAllTables.sql
Khi bạn hài lòng rằng kịch bản sẽ thực hiện công việc thì hãy làm điều này:
mysql ${MYSQL_CONN} < /root/OptimizeAllTables.sql
Hãy thử một lần !!!
CAUPAT
Vì mặc định cho innodb_file_per_table là ON, nên mỗi bảng InnoDB được tối ưu hóa sẽ thực sự .ibd
thu nhỏ tệp của nó . Bất kỳ bảng MyISAM nào (mà tôi hy vọng bạn không có) cũng sẽ bị thu hẹp .MYD
và .MYI
các tệp của chúng .
CẬP NHẬT 2012-09-18 18:19 EDT
Tôi chỉ thử như sau:
- Tạo Instance1 với Đĩa 5G
- Đã sửa đổi Instance1 thành 10G Disk
- Đã sửa đổi Instance1 thành 5G Disk (thông báo lỗi
Requested storage size (5) cannot be less then the current storage size (10)
:)
- Tạo Instance2 với 5G
- Đã tải Instance1 với dữ liệu 2MB
- Đã tạo Ảnh chụp nhanh của Instance1 (cùng kích thước: 10G)
Nếu tôi khôi phục ảnh chụp nhanh, nó sẽ tạo ra một Instance thứ ba. Ảnh chụp nhanh DB phải là toàn bộ Máy chủ, không phải là bất kỳ loại nào.
Bạn sẽ phải làm thủ tục lộn xộn sau:
- mysqldump dữ liệu từ Instance 20GB
- Tạo sơ đồ 10G mới
- tải mysqldump vào phiên bản 10GB mới
- xác minh tất cả dữ liệu bạn muốn
- phá hủy 20GB cũ
Ở bước 4, vui lòng chạy Truy vấn không gian lưu trữ động cơ lớn này trên cả hai phiên bản 20 GB và 10 GB
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
Bạn sẽ thấy có bao nhiêu không gian lãng phí biến mất khi di chuyển mysqldump sang Instance 10GB mới. Điều này chắc chắn sẽ chống phân mảnh tất cả các bảng InnoDB. Bạn có thể cần chạy tập lệnh trên ( /root/OptimizeAllTables.sql
) Tôi đã cho bạn ở trên để chạy OPTIMIZE TABLE
trên tất cả các bảng trong signs
cơ sở dữ liệu mỗi tuần một lần để giữ mức .ibd
nhỏ nhất có thể. Bạn cũng có thể chạy Truy vấn không gian lưu trữ động cơ lớn để theo dõi khi nó bắt đầu tiếp cận 10GB.
Requested storage size (5) cannot be less then the current storage size (10)
.