MySQL – Repair Tables
MySQL Repair Table Statement
There can be scenarios where tables in databases can become corrupted due to various reasons such as hardware failures, software bugs, or unexpected server crashes. When this situation happens, we cannot be able to access or manipulate the data in those tables because of data inconsistencies or errors.
In such situations, to repair those currupted tables, we use the MySQL REPAIR TABLE statement. This statement works for only certain engines such as MyISAM, etc.
Syntax
Following is the syntax of MySQL REPAIR TABLE Statement −
REPAIR [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
Example
Let us start by creating a table named CUSTOMERS using the following query −
CREATE TABLE CUSTOMERS ( ID INT AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
Here, we are inserting 7 records into the above created table using the below INSERT statement −
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, ''Ramesh'', 32, ''Ahmedabad'', 2000.00 ), (2, ''Khilan'', 25, ''Delhi'', 1500.00 ), (3, ''Kaushik'', 23, ''Kota'', 2000.00 ), (4, ''Chaitali'', 25, ''Mumbai'', 6500.00 ), (5, ''Hardik'', 27, ''Bhopal'', 8500.00 ), (6, ''Komal'', 22, ''Hyderabad'', 4500.00 ), (7, ''Muffy'', 24, ''Indore'', 10000.00 );
Assume the above created table is corrupted and we are using the REPAIR TABLE statement to repair it.
REPAIR TABLE CUSTOMERS;
The above query displays an error as: “The storage engine for the table doesn”t support repair” because the REPAIR TABLE statement won”t work with the default InnoDB engine.
Table | Op | Msg_type | Msg_text |
---|---|---|---|
tutorials.customers | repair | note | The storage engine for the table doesn”t support repair |
To repair the table, We need to change the table”s engine to MyISAM because it supports the REPAIR TABLE statement.
ALTER TABLE CUSTOMERS ENGINE = MyISAM;
Now, to repair the CUSTOMERS table, execute the following query −
REPAIR TABLE CUSTOMERS;
Output
We can see in the output below, it says OK which indicates that the table CUSTOMERS is in good condition, and there are no issues or corruption.
Table | Op | Msg_type | Msg_text |
---|---|---|---|
tutorials.customers | repair | status | OK |
Repairing multiple tables
In MySQL, we can also repair multiple tables and get the results using the REPAIR TABLE Statement. To do this, we just need to list the names of the tables we want to repair, separating them with commas.
Example
Let us create three different tables with the names Test1, Test2, and Test3 using the following CREATE TABLE statements −
CREATE TABLE Test1(ID INT, Name VARCHAR(255)); CREATE TABLE Test2(ID INT, Name VARCHAR(255)); CREATE TABLE Test3(ID INT, Name VARCHAR(255));
Assume the above three tables are corrupted. Change the engine of these tables to MyISAM to repair them with REPAIR TABLE statement −
ALTER TABLE Test1 ENGINE = MyISAM; ALTER TABLE Test2 ENGINE = MyISAM; ALTER TABLE Test3 ENGINE = MyISAM;
Now, to repair these tables, execute the following query −
REPAIR TABLE Test1, Test2, Test3;
As we can see in the output below, all three tables are in good condition, and there are no issues or corruption.
Table | Op | Msg_type | Msg_text |
---|---|---|---|
tutorials.test1 | repair | status | OK |
tutorials.test2 | repair | status | OK |
tutorials.test3 | repair | status | OK |
Repair Table Options
We have various optional clauses to use with REPAIR TABLE such as QUICK, EXTENDED, and, USE_FRM clause. Let us discuss them one by one with suitable examples.
QUICK Clause
The QUICK clause is the is the default and it is most commonly used with REPAIR TABLE. If you specify the QUICK clause, MySQL will repair the table without re-creating it. −
Example
In the following example, we are using the QUICK clause with the REPAIR TABLE statement to repair the CUSTOMERS table.
REPAIR TABLE CUSTOMERS QUICK;
Output
Executing the query above will produce the following output −
Table | Op | Msg_type | Msg_text |
---|---|---|---|
tutorials.customers | repair | status | OK |
EXTENDED Clause
If we specify the EXTENDED clause, MySQL not only repairs the table but also rebuilds the index and optimizes the table structure.
Note: The EXTENDED clause is a more time-consuming compared to QUICK clause.
Example
In the following example, we are using the EXTENDED clause with the REPAIR TABLE statement to repair the CUSTOMERS table.
REPAIR TABLE CUSTOMERS EXTENDED;
Output
Executing the query above will produce the following output −
Table | Op | Msg_type | Msg_text |
---|---|---|---|
tutorials.customers | repair | status | OK |
USE_FRM clause
We can use the USE_FRM clause, in case the MYI index file is missing. If you provide this clause the .NYI file will be recreated using information from the data dictionary −
Example
Here, we are using the USE_FRM clause with the REPAIR TABLE statement to repair the CUSTOMERS table.
REPAIR TABLE CUSTOMERS USE_FRM;
Output
Executing the query above will produce the following output −
Table | Op | Msg_type | Msg_text |
---|---|---|---|
tutorials.CUSTOMERS | repair | warning | Number of rows changed from 0 to 7 |
tutorials.customers | repair | status | OK |
Repairing table Using a Client Program
Besides repairing a table in a MySQL database with a MySQL query, we can also use a client program to perform the REPAIR TABLE operation.
Syntax
Following are the syntaxes to repair a table in various programming languages −
To repair a table in a MySQL Database through a PHP program, we need to execute the Repair Table statement using the mysqli function query() as −
$sql="Repair TABLE table_names"; $mysqli->query($sql);
To repair a table in a MySQL Database through a Node.js program, we need to execute the Repair Table statement using the query() function of the mysql2 library as −
sql=" REPAIR [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]"; con.query(sql);
To repair a table in a MySQL database through a Java program, we need to execute the Repair Table statement using the JDBC function executeUpdate() as −
String sql="Repair TABLE table_names"; statement.executeUpdate(sql);
To repair a table in a MySQL database through a Python program we need to execute the Repair Table statement using the execute() function of the MySQL Connector/Python as −
sql="REPAIR TABLE table_name"; cursorObj.execute(sql);
Example
Following are the programs −
$dbhost = ''localhost $dbuser = ''root $dbpass = ''password $dbname = ''TUTORIALS $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if ($mysqli->connect_errno) { printf("Connect failed: %s
", $mysqli->connect_error); exit(); } // printf(''Connected successfully.
''); $sql = " REPAIR TABLE SalesSummary "; if ($mysqli->query($sql)) { printf(" Table repair successfully.
"); } if ($mysqli->errno) { printf("table could not be repaired .
", $mysqli->error); } $mysqli->close();
Output
The output obtained is as follows −
Table repair successfully.
var mysql = require(''mysql2''); var con = mysql.createConnection({ host: "localhost", user: "root", password: "Nr5a0204@123" }); //Connecting to MySQL con.connect(function (err) { if (err) throw err; console.log("Connected!"); console.log("--------------------------"); sql = "Create Database TUTORIALS" con.query(sql); sql = "USE TUTORIALS" con.query(sql); sql = "CREATE TABLE sales(ID INT, ProductName VARCHAR(255), CustomerName VARCHAR(255), DispatchDate date, DeliveryTime time, Price INT, Location VARCHAR(255));" con.query(sql); sql = "insert into sales values(1, ''Key-Board'', ''Raja'', DATE(''2019-09-01''), TIME(''11:00:00''), 7000, ''Hyderabad''),(2, ''Earphones'', ''Roja'', DATE(''2019-05-01''), TIME(''11:00:00''), 2000, ''Vishakhapatnam''),(3, ''Mouse'', ''Puja'', DATE(''2019-03-01''), TIME(''10:59:59''), 3000, ''Vijayawada''),(4, ''Mobile'', ''Vanaja'', DATE(''2019-03-01''), TIME(''10:10:52''), 9000, ''Chennai''),(5, ''Headset'', ''Jalaja'', DATE(''2019-04-06''), TIME(''11:08:59''), 6000, ''Goa'');" con.query(sql); sql = "ALTER TABLE Sales ENGINE = MyISAM;" con.query(sql); sql = "REPAIR TABLE Sales;" con.query(sql, function(err, result){ if (err) throw err console.log(result); }); });
Output
The output produced is as follows −
Connected! -------------------------- [ { Table: ''tutorials.sales'', Op: ''repair'', Msg_type: ''status'', Msg_text: ''OK'' } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class RepairTable{ public static void main(String[] args){ String url = "jdbc:mysql://localhost:3306/TUTORIALS"; String username = "root"; String password = "password"; try{ Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); System.out.println("Connected successfully...!"); //Repair tables...! String sql = "REPAIR TABLE customers"; statement.executeUpdate(sql); System.out.println("Table repaired successfully...!"); connection.close(); } catch(Exception e){ System.out.println(e); } } }
Output
The output obtained is as shown below −
Connected successfully...! Table repaired successfully...!
import mysql.connector #establishing the connection connection = mysql.connector.connect( host=''localhost'', user=''root'', password=''password'', database=''tut'' ) table_name = ''tutorials_tbl_temp'' #Creating a cursor object cursorObj = connection.cursor() repair_table_query = f"REPAIR TABLE {table_name}" cursorObj.execute(repair_table_query) print(f"Table ''{table_name}'' is repaired successfully.") # Fetch and consume any remaining results from the cursor # ensuring that there are no unread results before closing the cursor. for _ in cursorObj: pass cursorObj.close() connection.close()
Output
Following is the output of the above code −
Table ''tutorials_tbl_temp'' is repaired successfully.