Beberapa hari yang lalu, salah satu host server yang digunakan di datacenter mengharuskan emergency maintenance. Hal tersebut mengakibatkan salah satu server yang ada di atasnya harus dipindahkan ke dalam host lain. Kebetulan server tersebut adalah Zimbra Mail Server dan diinstall di atas VM.
Proses pemindahan membutuhkan waktu kurang dari 1 jam. Setelah server Zimbra Mail dipindahkan, ternyata servicesnya tidak dapat distart secara normal. Ada kendala di sisi database yang tidak mau start. Belum diketahui penyebab dari kendala tersebut apa. Apakah karena power off tiba-tiba atau yang lainnya.
Untuk mengatasi kendala tersebut, dilakukanlah proses recovery sesuai dengan petunjuk pada Zimbra Wiki: https://wiki.zimbra.com/wiki/Mysql_Crash_Recovery
Proses recovery berjalan lancar. Namun ada kendala ketika dilakukan pengecekan via dbintegrity. Yaitu hilangnya tabel gtid_slave_pos, innodb_index_stats, dan innodb_table_stats seperti berikut:
Untuk mengembalikan table tersebut, dilakukan recovery sebagai berikut:
# Stop service Zimbra
su - zimbra zmcontrol stop
# Backup DB sebelum dilakukan recovery
cp -r /opt/zimbra/db /opt/zimbra/db-backup
# Hapus file table innodb dan gtid
cd /opt/zimbra/db/data/mysql/ rm -f innodb_* gtid_slave_pos.*
# Start service Zimbra Mysql
mysql.server start
# Buat ulang table innodb dan gtid
Table yang dibuat berjumlah 3 table
mysql mysql -e "CREATE TABLE innodb_index_stats ( database_name VARCHAR(64) NOT NULL, table_name VARCHAR(64) NOT NULL, index_name VARCHAR(64) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, /* there are at least: stat_name='size' stat_name='n_leaf_pages' stat_name='n_diff_pfx%' */ stat_name VARCHAR(64) NOT NULL, stat_value BIGINT UNSIGNED NOT NULL, sample_size BIGINT UNSIGNED, stat_description VARCHAR(1024) NOT NULL, PRIMARY KEY (database_name, table_name, index_name, stat_name) ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0" mysql mysql -e "CREATE TABLE IF NOT EXISTS innodb_table_stats ( database_name VARCHAR(64) NOT NULL, table_name VARCHAR(64) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, n_rows BIGINT UNSIGNED NOT NULL, clustered_index_size BIGINT UNSIGNED NOT NULL, sum_of_other_index_sizes BIGINT UNSIGNED NOT NULL, PRIMARY KEY (database_name, table_name) ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0" mysql mysql -e "CREATE TABLE IF NOT EXISTS gtid_slave_pos ( domain_id INT UNSIGNED NOT NULL, sub_id BIGINT UNSIGNED NOT NULL, server_id INT UNSIGNED NOT NULL, seq_no BIGINT UNSIGNED NOT NULL, PRIMARY KEY (domain_id, sub_id)) COMMENT='Replication slave GTID position'"
Table system tersebut diambil dari file mysql_system_tables.sql. File tersebut dapat dicari via perintah berikut
find /opt/zimbra/ -name mysql_system_tables.sql
# Stop service mysql
mysql.server stop
# Start Zimbra Service
zmcontrol start
# Cek via zmdbintegrityreport
/opt/zimbra/libexec/zmdbintegrityreport -v
Setelah tidak ada error, akhirnya Zimbra dapat digunakan kembali
Silakan dicoba dan semoga bermanfaat 🙂
Source: https://heholdsthekeys.net/doku.php?id=tech_documents:zimbra:fix_database_issues