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ự .ibdthu 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 .MYDvà .MYIcá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 TABLEtrên tất cả các bảng trong signscơ sở dữ liệu mỗi tuần một lần để giữ mức .ibdnhỏ 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).