Import single database from --all-databases dump
Asked Answered
Y

5

97

Is it possible to import a single database from an --all-databases mysqldump? I guess I can modify the file manually but wondering if there are any command line options to do this.

I am moving servers and have a lot of databases, most of which I don't currently need or want at the moment but would like to have the option to restore a single one if need be.

Yasminyasmine answered 26/2, 2010 at 14:45 Comment(0)
M
89

mysqldump output is just a set of SQL statements.

You can provide the desired database in the command line and skip the commands against the other databases using:

mysql -D mydatabase -o mydatabase < dump.sql

This will only execute the commands when mydatabase is in use

Maemaeander answered 26/2, 2010 at 14:51 Comment(6)
Thanks for the fast answer! Awesome.Yasminyasmine
Very useful for me, Thanks!! you can add --disable-keys for avoid errors of foreign keys ;) mysql -u user -D --disable-keys database -o <dump.sqlPraxiteles
This is answer is very reckless and incredibly dangerous. If you launch mysqldump --all-databases, the mysqldump output will contain DROP DATABASE IF EXISTS dbname; CREATE DATABASE dbname; USE dbname; for every database in the MySQL instance, including the mysql schema. Please look at the mysqldump documentation: dev.mysql.com/doc/refman/5.5/en/…. That means every database will mercilessly get overwritten. Can you provide proof that it will be skipping all database but one ??? NOTE: You could do this to binary logs using mysqlbinlog.Merriment
For the paranoid, I first created a user who only had rights to the specific database and then ran this command with that user's credentials. I got an error when it tried to switch databases but the data for the specific database was retained.Koehn
This answer is incorrect. The -D option has no effect when reading MySQL statements from a file generated by mysqldump --all-databases. Furthermore it will DROP and CREATE tables in the mysql schema, including the users table.Aviate
@Merriment I tested now and with the option -o I asure you my other databases were not overwritten, thus reconsider your commentSheerlegs
G
124

You can use the following command:

mysql -u root -p --one-database destdbname < alldatabases.sql

Where destdbname is your desired database which you want to restore.

Another option which is IMHO much safer, is to extract the DB from an --all-databases dump. Example:

sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' alldatabases.sql > output.sql

Replace dbname with the desired database name. alldatabases.sql is the name of your sql-dump file. That way you'll have the seperated DB on file, and then you can restore using a simple mysql command.

(Credits goes to: Darren Mothersele - see his page)

Grazynagreabe answered 22/9, 2014 at 13:58 Comment(7)
Great solution ! This said I had to add the original dump header to avoid some errors ...Domel
This should be the accpted answerBeisel
Note that this does not work in Powershell, but works in cmdRabon
The sed thing is really helpful!Carricarriage
How come you say Another option which is IMHO much safer? Are there any risks in using --one-database?Municipality
I tested now and it does work. The other databases were keptSheerlegs
Maybe I'm wrong, but wouldn't the sed extraction fail if the DB in question happens to be the last one exported (or the only one), as there wouldn't be a second Current Database to match?Bret
M
89

mysqldump output is just a set of SQL statements.

You can provide the desired database in the command line and skip the commands against the other databases using:

mysql -D mydatabase -o mydatabase < dump.sql

This will only execute the commands when mydatabase is in use

Maemaeander answered 26/2, 2010 at 14:51 Comment(6)
Thanks for the fast answer! Awesome.Yasminyasmine
Very useful for me, Thanks!! you can add --disable-keys for avoid errors of foreign keys ;) mysql -u user -D --disable-keys database -o <dump.sqlPraxiteles
This is answer is very reckless and incredibly dangerous. If you launch mysqldump --all-databases, the mysqldump output will contain DROP DATABASE IF EXISTS dbname; CREATE DATABASE dbname; USE dbname; for every database in the MySQL instance, including the mysql schema. Please look at the mysqldump documentation: dev.mysql.com/doc/refman/5.5/en/…. That means every database will mercilessly get overwritten. Can you provide proof that it will be skipping all database but one ??? NOTE: You could do this to binary logs using mysqlbinlog.Merriment
For the paranoid, I first created a user who only had rights to the specific database and then ran this command with that user's credentials. I got an error when it tried to switch databases but the data for the specific database was retained.Koehn
This answer is incorrect. The -D option has no effect when reading MySQL statements from a file generated by mysqldump --all-databases. Furthermore it will DROP and CREATE tables in the mysql schema, including the users table.Aviate
@Merriment I tested now and with the option -o I asure you my other databases were not overwritten, thus reconsider your commentSheerlegs
F
2

When using the sed-approach suggested by Hetzbh, be sure to manually copy the initial and final lines from the original dump, such as e.g.

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

and

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

to the start and end respectively of the stripped file produced by sed. Otherwise import may fail due to foreign constraints not respected by the alphabetic order of the tables in the dump (i.e. errno: 150 "Foreign key constraint is incorrectly formed").

Flavouring answered 3/12, 2020 at 13:45 Comment(0)
R
0

Here is the command that would restore only the database named $DB_FROM from $BACKUP_FILE backup file:

(sed '/^-- Current Database: `/q' "$BACKUP_FILE"; sed -n "/^-- Current Database: \`$DB_FROM\`/,/^-- Current Database: \`/p" "$BACKUP_FILE") | mysql -u root -p

If you like at the same time to restore the new database as $DB_TO (instead of $DB_FROM), that means restoring the database to a different name, here is the full command:

(sed '/^-- Current Database: `/q' "$BACKUP_FILE"; sed -n "/^-- Current Database: \`$DB_FROM\`/,/^-- Current Database: \`/p" "$BACKUP_FILE") | sed "s/\`$DB_FROM\`/\`$DB_TO\`/g" | mysql -u root -p

My answer was inspired by this one as well as this one and this webpage.

Rachellerachis answered 28/9, 2021 at 16:10 Comment(0)
D
0

The method suggested by MariaDB docs is to restore just one object (table or database) by creating temporarily a user with just the privileges for the object to restore, like so:

GRANT SELECT
ON db1.* TO 'admin_restore_temp'@'localhost' 
IDENTIFIED BY 'its_pwd';

GRANT ALL ON db1.table1
TO 'admin_restore_temp'@'localhost';

After that, the restore can be done safely:

mysql --user admin_restore_temp --password --force < /data/backup/db1.sql
Discommend answered 18/3, 2022 at 15:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.