I am using LINUX and I have mistakenly deleted ibdata1 file in mysql folder.
I restarted the 'mysqld' service and Now when I am trying to read data from the databases it is not开发者_Go百科 able to find out older tables.
Am I in a big trouble? Please throw some light on this if any idea.
Thanks for your time.
Thanks and Regards, SachinJadhav.
You are in big trouble...
By default ibdata1 contains all the table's data (and therefore is lost). Even if you configure it to use a separate file per table, all internal MySQL's data is stored in that file, and as far as I know, there is no way to restore it.
Really hope you have a backup....
Unless you defined innodb_file_per_table
, this is a single tablespace that along with the transaction logs (stored in ib_logfile*
) keep your table data.
Deleting it will effictively delete all data stored in the InnoDB
tables.
if innodb_file_per_table
is enabled then the tables can be restored via this and this.
Blatent copy of https://dba.stackexchange.com/a/57157/189538
MyISAM
For a MyISAM table mydb.mytable, you should have three files
\bin\mysql\mysql5.6.12\data\mydb\mytable.frm
\bin\mysql\mysql5.6.12\data\mydb\mytable.MYD
\bin\mysql\mysql5.6.12\data\mydb\mytable.MYI
They should already be accessible as a table since each file contains needed data, metadata, and index info. Collectively, they form the table. There are no external storage engine mecahnisms to access.
InnoDB
Take a look at this Pictorial Representation of InnoDB
InnoDB Architecture
The only thing that attaches ibdata1 to the .ibd
files is the data dictionary.
Your mission, should you decide to accept it, is to create each table and swap in the .ibd
Before you do anything, make a full copy of "\bin\mysql\mysql5.6.12\data" to another
Here is a sample
Suppose you have a database mydb
with the table mytable
. This means
- You have the folder
\bin\mysql\mysql5.6.12\data\mydb
- Inside that folder, you have
mytable.frm
mytable.ibd
You need the .frm
. If you look at my post https://dba.stackexchange.com/questions/44314/how-can-extract-the-table-schema-from-just-the-frm-file/44316#44316, you can download a MySQL utility that can generate the SQL needed to create the table.
You should now do the following
- Move
mytable.ibd
to\bin\mysql\mysql5.6.12\data
- Run the SQL to create the InnoDB table
- Login to mysql and run
ALTER TABLE mydb.mytable DISCARD TABLESPACE;
(This will delete\bin\mysql\mysql5.6.12\data\mydb\mytable.ibd
) - Copy
\bin\mysql\mysql5.6.12\data\mytable.ibd
into\bin\mysql\mysql5.6.12\data\mydb
- Login to mysql and run
ALTER TABLE mydb.mytable IMPORT TABLESPACE;
(This will register\bin\mysql\mysql5.6.12\data\mydb\mytable.ibd
into the data dictionary)
After this, the table mydb.mytable
should be fully accessible. You can test that accessibility by simply running:
SELECT * FROM mydb.mytable LIMIT 10;
Give it a Try !!!
DRINK (Data Recovery Incorporates Necessary Knowledge) Responsibly
Blatant copy of https://dba.stackexchange.com/a/93511/189538
Not as part of MySQL, but tools like Percona Xtrabackup makes the process a bit faster for exporting/backing up the tables, allowing things like using regular expressions or lists for filtering:
- Partial backups
- Restoring individual tables
For importing a list of tables, you can use some automation oneliners like this one found on Bill Karwin tools:
mysqldump --no-data $schema > schema-ddl.sql
mysql -N -B <<'EOF' > discard-ddl.sql
SELECT CONCAT('ALTER TABLE `', table_name, '` DISCARD TABLESPACE;') AS _ddl
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$schema' AND ENGINE='InnoDB';
EOF
mysql -N -B <<'EOF' > import-ddl.sql
SELECT CONCAT('ALTER TABLE `', table_name, '` IMPORT TABLESPACE;') AS _ddl
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$schema' AND ENGINE='InnoDB';
EOF
Basically, you can use the information_schema.tables
table for listing the tables you want using "dynamic sql". For example, change $schema
above for the desired database name.
精彩评论