นี่คือสิ่งที่ฉันทำใน mariadb 10.2.16 บน fedora เมื่อฉันมีตารางที่แสดงข้อผิดพลาดเดียวกันในล็อกไฟล์ฉันคิดว่า ...
2018-07-11 9:43:58 140323764213504 [Note] InnoDB: The file './database_name/innodb_table.ibd' already exists though the corresponding table did not exist in the InnoDB data dictionary. You can resolve the problem by removing the file.
2018-07-11 9:44:29 140323764213504 [Warning] InnoDB: Tablespace 'database_name/innodb_table' exists in the cache with id 2836 != 2918
ระยะทางและข้อผิดพลาดของคุณอาจแตกต่างกันไป แต่สิ่งสำคัญที่ฉันคิดคือ
...already exists though the corresponding table did not exist in the InnoDB data dictionary...
มีโต๊ะวางไม่ทำงานรวมทั้งปรับเปลี่ยนตาราง ...
MariaDB [database_name]> drop table innodb_table;
ERROR 1051 (42S02): Unknown table 'database_name.innodb_table'
MariaDB [database_name]> alter table innodb_table discard tablespace;
ERROR 1146 (42S02): Table 'database_name.innodb_table' doesn't exist
สร้างตารางก็ล้มเหลวเช่นกัน:
MariaDB [database_name]> create table innodb_table(`id` int(10) unsigned NOT NULL);
ERROR 1813 (HY000): Tablespace for table '`database_name`.`innodb_table`' exists. Please DISCARD the tablespace before IMPORT
เพื่อแก้ไขปัญหานี้สิ่งที่ฉันทำคืออันดับแรก
create table innodb_table2(`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.07 sec)
จากนั้นในไดเร็กทอรี / var / lib / mysql / database_name ฉันทำสิ่งต่อไปนี้เนื่องจากรูทยอมรับการเขียนทับของ innodb_table.ibd ที่ทำให้เราเกิดปัญหา
cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb
จากนั้นกลับไปที่คอนโซล mysql ฉันออกคำสั่ง drop สำเร็จบนทั้งสองตาราง
MariaDB [database_name]> drop table innodb_table;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8
Current database: database_name
Query OK, 0 rows affected (0.08 sec)
MariaDB [database_name]> drop table innodb_table2;
Query OK, 0 rows affected (0.25 sec)
ตอนนี้ทุกอย่างเป็นสี่เหลี่ยมจัตุรัสและฉันสามารถสร้างตารางเดียวขึ้นมาใหม่ได้ ...
MariaDB [database_name]> create table innodb_table (`id` int(10) unsigned NOT NULL);
Query OK, 0 rows affected (0.08 sec)
แก้ไข: ฉันจะเพิ่มในไฟล์
restorecon -Rv /var/lib/mysql/database_name
คำสั่งหลังจากการคัดลอกฐานข้อมูลเพื่อให้ได้บริบท Selinux ทั้งหมดอย่างที่ควรจะเป็นแม้ว่าเราจะลบออกจากฐานข้อมูลเกือบจะในทันที แต่ในทางเลือกอื่นคุณสามารถเพิ่มตัวเลือก --archive หรือ -a ให้กับสอง cp คำสั่งใช่จริงๆแล้วตัวเลือกการเก็บถาวรทำให้สิ่งนี้สั้นลง:
cp innodb_table2.frm innodb_table.frm
cp innodb_table2.ibd innodb_table.ibd
chown mysql:mysql innodb_table.frm innodb_table.ibd
chmod 660 innodb_table.frm innodb_table.ibd
restorecon -Rv /var/lib/mysql/database_name
systemctl restart mariadb
เป็นเพียงสิ่งต่อไปนี้ที่ฉันคิดว่าดีกว่าและรักษาบริบทของเซลินุกซ์ที่กำหนดไว้สำหรับตารางที่ทำไว้แล้ว
cp -a innodb_table2.frm innodb_table.frm
cp -a innodb_table2.ibd innodb_table.ibd
systemctl restart mariadb
ฉันได้แทนที่รายการคำสั่งที่ยาวกว่าข้างต้นสำหรับรายการที่สั้นกว่าซึ่งสามารถย่อให้สั้นลงได้ด้วย *