| « mount over ssh - sshfs | La mulți ani PHP ! - 14 ani » |
for DB in `grep "Current Database:" all-databases.sql | replace "-- Current Database: " "" | tr -d "\\\`" `; do sed -n "/-- Current Database: \`$DB\`/,/-- Current Database:/p" all-databases.sql > ${DB}.sql; done
Complicated... yes.. you're right. Let's go step by step...
My pro-bono hosting died... it allowed me to extract (almost) all my data. I had no time for fancy stuff so I dumped with mysqldump all databases from that mysql instance in a single flat file called "all-databases.sql".
Now you know mysqldump uses a lot of fancy markers to delimit databases. So all you need to do is search in the file lines starting with "Current Database:", for this I used grep:
[radical@acasa databases]$ grep "Current Database:" all-databases.sql
-- Current Database: `DBNAME`
-- Current Database: `Diverse`
-- Current Database: `FastIt`
-- Current Database: `Formare`
-- Current Database: `OldFormare`
-- Current Database: `Skeleton`
-- Current Database: `dex`
-- Current Database: `drupal`
-- Current Database: `e-radical`
-- Current Database: `eventum`
-- Current Database: `fastit_eventum`
-- Current Database: `mircea-nechita`
-- Current Database: `mysql`
-- Current Database: `rahan`
-- Current Database: `sym`
-- Current Database: `test`
Next step is to extract from this output the name of the databases. For this you may use "tr" but I like more "replace" provided by mysql because is, at least, more clearer:
[radical@acasa databases]$ grep "Current Database:" all-databases.sql | replace "-- Current Database: " ""
`DBNAME`
`Diverse`
`FastIt`
`Formare`
`OldFormare`
`Skeleton`
`dex`
`drupal`
`e-radical`
`eventum`
`fastit_eventum`
`mircea-nechita`
`mysql`
`rahan`
`sym`
`test`
Follow up:
Pesky mysqldump uses backtick for names... which is good when you want to reload the file... let's strip this character, for this I'm going to use "tr" with -d (that is delete) flag:
[radical@acasa databases]$ grep "Current Database:" all-databases.sql | replace "-- Current Database: " "" | tr -d "\\\`"
DBNAME
Diverse
FastIt
Formare
OldFormare
Skeleton
dex
drupal
e-radical
eventum
fastit_eventum
mircea-nechita
mysql
rahan
sym
test
Now we have all database names from the dump itself and I want for each database a file... probably you got it... a for loop. In bash you can loop like this:
for i in `some command with ouput`
do
# do something with $i
echo -e $i;
done
But the same thing can be obtained in command line wrapping it like this:
for i in `some command with ouput`; do echo -e $i; done
In our case it is:
[radical@acasa databases]$ for db in `grep "Current Database:" all-databases.sql | replace "-- Current Database: " "" | tr -d "\\\`" `; do echo -e $db; done
DBNAME
Diverse
FastIt
Formare
OldFormare
Skeleton
dex
drupal
e-radical
eventum
fastit_eventum
mircea-nechita
mysql
rahan
sym
test
Now to get one database out of the dump you should use:
sed -n "/-- Current Database: \`e-radical\`/,/-- Current Database:/p" all-databases.sql > e-radical.sql
This will give you a file named e-radical.sql with "e-radical" database.
Now to put his toghether:
[radical@acasa databases]$ for db in `grep "Current Database:" all-databases.sql | replace "-- Current Database: " "" | tr -d "\\\`" `; do sed -n "/-- Current Database: \`$db\`/,/-- Current Database:/p" all-databases.sql > ${db}.sql; done
[radical@acasa databases]$ ls -al
total 326436
drwxrwxr-x 2 radical radical 4096 2009-06-10 23:00 .
drwxr-xr-x 8 radical radical 4096 2009-06-09 20:41 ..
-rwxr-xr-x 1 radical radical 166920047 2009-06-07 20:26 all-databases.sql
-rw-rw-r-- 1 radical radical 3759 2009-06-10 23:00 DBNAME.sql
-rw-rw-r-- 1 radical radical 137113878 2009-06-10 23:00 dex.sql
-rw-rw-r-- 1 radical radical 127475 2009-06-10 23:00 Diverse.sql
-rw-rw-r-- 1 radical radical 948589 2009-06-10 23:00 drupal.sql
-rw-rw-r-- 1 radical radical 8949225 2009-06-10 23:00 e-radical.sql
-rw-rw-r-- 1 radical radical 211079 2009-06-10 23:00 eventum.sql
-rw-rw-r-- 1 radical radical 313830 2009-06-10 23:00 fastit_eventum.sql
-rw-rw-r-- 1 radical radical 385847 2009-06-10 23:00 FastIt.sql
-rw-rw-r-- 1 radical radical 720021 2009-06-10 23:00 Formare.sql
-rw-rw-r-- 1 radical radical 94367 2009-06-10 23:00 mircea-nechita.sql
-rw-rw-r-- 1 radical radical 2710829 2009-06-10 23:00 mysql.sql
-rw-rw-r-- 1 radical radical 700677 2009-06-10 23:00 OldFormare.sql
-rw-rw-r-- 1 radical radical 14629329 2009-06-10 23:00 rahan.sql
-rw-rw-r-- 1 radical radical 8662 2009-06-10 23:00 Skeleton.sql
-rw-rw-r-- 1 radical radical 1600 2009-06-10 23:00 sym.sql
-rw-rw-r-- 1 radical radical 606 2009-06-10 23:00 test.sql
Now this is it... I now have a file for each DB from within the .sql file.
It took some time...
...happy extracting.
PS: Yes... please don't mention it... I did had a database called "DBNAME".
Trackback address for this post
Trackback URL (right click and copy shortcut/link location)
Recent comments