Fix Error [1932] Table doesn't exist in engine
Pada saat terdapat error [1932] Table doesn’t exist in engine, backup database yang ada pada directory /var/lib/mysql/
terlebih dahulu dengan mv atau copy ke directory lain.
mkdir /var/lib/mysql_backup
cp -a /var/lib/mysql/* /var/lib/mysql_backup/
Masuk ke mysql dan create database baru.
mysql> create database newdb;
mysql> quit;
Install mysql-utilities.
Debian> apt install mysql-utilities -y
Ubuntu> apt install mysql-utilities -y
CentOs> yum install mysql-utilities -y
Fedora> dnf install mysql-utilities -y
Jalankan perintah dibawah ini untuk mendapatkan schema table.
cd /root/
touch dump.sql
mysqlfrm --user=root --server=root\@localhost --port 3300 /var/lib/mysql/olddb/table_name.frm > dump.sql
Fix file sql dump dengan perintah dibawah.
sed -i 's/#.*//' dump.sql
sed -i "s/olddb/newdb/" dump.sql
sed -i 's/CHARSET=utf8.*/CHARSET=utf8;/' dump.sql
Import file dump.sql ke database baru.
mysql newdb < dump.sql
Discard table dengan perintah dibawah.
mysql> use newdb;
mysql> ALTER TABLE table_name DISCARD TABLESPACE;
Copy file .ibd dari olddb ke newdb.
cp /var/lib/mysql/olddb/table_name.ibd /var/lib/mysql/newdb/
chown mysql:mysql /var/lib/mysql/newdb/table_name
Import table dengan perintah dibawah.
mysql> use newdb;
mysql> ALTER TABLE table_name DISCARD TABLESPACE;
Catatan: Error [1932] Table doesn’t exist in engine biasanya terjadi pada table dengan engine Innodb, Jika table dari database ada yang menggunakan MyISAM cukup copy file .frm, .MYD dan .MYI saja ke database baru.
Jika terlalu lama menggunakan perintah diatas, ubah saja menjadi shell script seperti berikut.
vim fix-table.sh
Masukan script berikut, ubah sesuai nama database nya.
#!/bin/bash
echo -e "\033[0;32mBenerin table...\033[0m"
msg="table"
if [ $# -eq 1 ]
then msg="$1"
fi
table="$msg"
olddb="olddb_name"
newdb="newdb_name"
cat /dev/null > /root/fix-db/dump.sql
echo -e "Get Schema"
mysqlfrm --user=root --server=root\@localhost --port 3300 /var/lib/mysql/"$olddb"/"$table".frm > dump.sql
echo -e "Fix dump file"
sed -i 's/#.*//' dump.sql
sed -i "s/$olddb/$newdb/" dump.sql
sed -i 's/CHARSET=utf8.*/CHARSET=utf8;/' dump.sql
echo -e "Import database"
mysql --database="$newdb" < dump.sql
echo -e "Discard table"
mysql --database="$newdb" --execute="ALTER TABLE $newdb.$table DISCARD TABLESPACE;"
echo -e "Copy .ibd files"
cp /var/lib/mysql/"$olddb"/"$table".ibd /var/lib/mysql/"$newdb"/"$table".ibd
echo -e "Change permission for .ibd files"
chown mysql:mysql /var/lib/mysql/"$newdb"/"$table".ibd
echo -e "Import table"
mysql --database="$newdb" --execute="ALTER TABLE $newdb.$table IMPORT TABLESPACE;"
echo -e "Done..."
Jika sudah berikan hak execute.
chmod +x fix-table.sh
Jalankan dengan perintah berikut:
./fix-table.sh "table_name"
Selesai..