Importing mysql dump without overwriting existing data - mysql

I accidentally replaced all records for a field in a mysql table with NULL and am attempting to restore a backup so I can run an update query between my current table and the backup. I created a new db called db_bckup, left it empty, then tried to import it from the command line:
mysql -u root -p db_bckup < mysqlbackupfile.sql
I assumed this would load the backup to my db_bckup database which was empty. To my surprise, it overwrote my original database rather than loading into db_bckup. In looking at the contents of the sql file, I noted that the contents include lines:
Host: localhost Database: db
-------------------------------------------
Server version 5.5.34-0ubuntu0.13.04.1
[SET a bunch of things]
Current Database: 'db'
CREATE DATABASE /*!32312 IF NOT EXISTS*/ 'db' /*!40100 DEFAULT CHARACTER SET latin1 */;
USE 'db';
[table specific stuff]
I suspect that the references to 'db' in the sql file is overriding my command line import code.
My question is: Is it the sql file or command line that's causing the overwrite? If the sql file is the cause, is it a matter of editing the backup file manually to change the db name to db_bckup or is there a more administrative way to change all the 'db' references within the file to 'db_bckup'? I am a little wary of messing with the backup file, so I'd like to take the best approach those with more experience would recommend.

If you specify db_name when mysqldump, USE db_name will not printed in it's output. I guess that you tried --databases or --all-database
Usage: mysqldump [OPTIONS] database [tables] <= you need to run mysqldump this way
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
and FYI, mysqldump provides option which not create table.
-t, --no-create-info Don't write table creation info.

Related

Importing a MySQL Database on Localhost

So I wanted to format my system and I had a lot of works that I have done on my localhost that involves databases. I followed the normal way of backing up the database by exporting it into an SQL file but I think I made a mess by making a mistake of backing up everything in one SQL file (I mean the whole localhost was exported to just one SQL file).
The problem now is: when I try to import the backed up file I mean the (localhost.sql), I get an error like
tables already exist.
information_schema
performance_schema
an every other tables that comes with Xampp, which has been preventing me from importing the database.
These tables are the phpmyadmin tables that came with Xampp. I have been trying to get past this for days.
My question now is that can I extract different databases from the same compiled SQL database file?
To import a database you can do following things:
mysql -u username -p database_name < /path/to/database.sql
From within mysql:
mysql> use database_name;
mysql> source database.sql;
The error is quite self-explanatory. The tables information_schema and performance_schema are already in the MySQL server instance that you are trying to import to.
Both of these databases are default in MySQL, so it is strange that you would be trying to import these into another MySQL installation. The basic syntax to create a .sql file to import from the command line is:
$ mysqldump -u [username] -p [database name] > sqlfile.sql
Or for multiple databases:
$ mysqldump --databases db1 db2 db3 > sqlfile.sql
Then to import them into another MySQL installation:
$ mysql -u [username] -p [database name] < sqlfile.sql
If the database already exists in MySQL then you need to do:
$ mysqlimport -u [username] -p [database name] sqlfile.sql
This seems to be the command you want to use, however I have never replaced the information_schema or performance_schema databases, so I'm unsure if this will cripple your MySQL installation or not.
So an example would be:
$ mysqldump -uDonglecow -p myDatabase > myDatabase.sql
$ mysql -uDonglecow -p myDatabase < myDatabase.sql
Remember not to provide a password on the command line, as this will be visible in plain text in the command history.
The point the previous responders seem to be missing is that the dump file localhost.sql when fed into mysql using
% mysql -u [username] -p [databasename] < localhost.sql
generates multiple databases so specifying a single databasename on the command line is illogical.
I had this problem and my solution was to not specify [databasename] on the command line and instead run:
% mysql -u [username] -p < localhost.sql
which works.
Actually it doesn't work right away because of previous attempts
which did create some structure inside mysql, and those bits in localhost.sql
make mysql complain because they already exist from the first time around, so
now they can't be created on the second time around.
The solution to THAT is to manually edit localhost.sql with modifications like
INSERT IGNORE for INSERT (so it doesn't re-insert the same stuff, nor complain),
CREATE DATABASE IF NOT EXISTS for CREATE DATABASE,
CREATE TABLE IF NOT EXISTS for CREATE TABLE,
and to delete ALTER TABLE commands entirely if they generate errors because by then
they've already been executed ((and INSERTs and CREATEs perhaps too for the same reasons). You can check the tables with DESCRIBE TABLE and SELECT commands to make sure that the ALTERations, etc. have taken hold, for confidence.
My own localhost.sql file was 300M which my favorite editor emacs complained about, so I had to pull out bits using
% head -n 20000 localhost.sql | tail -n 10000 > 2nd_10k_lines.sql
and go through it 10k lines at a time. It wasn't too hard because drupal was responsible for an enormous amount, the vast majority, of junk in there, and I didn't want to keep any of that, so I could carve away enormous chunks easily.
unzip -p /pathoffile/database_file.zip | mysql -uusername -p databsename;
Best way to import database in localhost has simple 5 steps:
zip sql file first to compress databse size.
go to termianl.
create empty database.
Run Command unzip databse With Import database: unzip -p /pathoffile/database_file.zip | mysql -uusername -p databsename;
Enter Password

Linux - Import SQL File Into Non-Existant Database

Normally I have database already created. So this command line works find:
mysql -h -u -p [databaseName] < dump.sql
I have an import.sql file that has a top query that creates the database, if it doesn't already exist.
Is there a way to import the sql file, but without needing to select a pre-existing database?
Invoke the commandline without specifying the database
mysql -h -u -p < dump.sql
inside dump.sql, after you create the database add
USE databasename;
While creating the dump file using mysqldump you can use the switch --add-drop-database. This will include a statement to drop the database first. So in the subsequent statement, a fresh database will be created since no database with the given name exists
See mysql documentation for more

How to import a MySQL dump from command line WITH overwrite

i googled a lot and i can't found nothing about it !
[root#someday backups]# mysql -u username_1 -p db_1 < tables_to_import/tables.sql
ERROR 1050 (42S01) at line 19: Table 'ps_customer' already exists
with mysql -f is the same. i wish simply import that .sql and rewrite that tables, can someone help me ?
p.s. i know that when you export a db you can choose option "DROP TABLE" but if i have a backup, without this declaration ? how can i force ? Thanks
When you do mysqldump add --add-drop-table (like twihoX mentioned). Then do your import as usual. So something like:
mysqldump --add-drop-table -u user -p db_1 > dumpfile.sql
mysql -u user -p db_1 < dumpfile.sql
Are you trying to overwrite the entirety of the database? If so, you could manually drop all the tables, and then run your import script. This is easy to do in phpmyadmin. If you're using the CLI, the fastest way would be to use DROP DATABASE databasename and then create database, though I think you'd then have to re-grant privileges for any non-root users.
Another option would be to open up your dump file and add DROP TABLE tablename before each of the CREATE TABLE commands. You could probably do this easily with some clever regex.
I'd suggest --add-drop-table option.
I know this question is a bit old and it's been marked as answered correctly, I'd just like to add this here for those (like me) who didn't use --add-drop-table when exporting.
What you can do is log in to MySQL and drop the tables that you plan to overwrite, then use --force on import.
So login to MySQL
mysql -h HOSTNAME - USERNAME -p
then tell mysql which database you wish to use
mysql> use DATABASE_NAME
drop tables that you want to overwrite
mysql> DROP TABLE my_images;
Then you are ready to import, so log out of mysql and back to where your SQL file was uploaded and run the following command
$ mysql --force -uDB_USER -p DB_NAME < myuploadedfile.sql
This will force MySQL to continue importing any new tables and ignore the 'table already exists error'

mysql restore to different database

I back up my production database with the following command:
mysqldump -u root --opt --skip-extended-insert --databases my_production_db
The resulting dump file has the following lines near the top:
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `my_production_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `my_production_db `;
In order to restore the database to a different destination ie. my_debvelopment_db I have to open the dump file and edit the bits where the database is named.
Then I run:
mysql -u root -p <password> < mydumpfile
I have not figured out another way to do it.
As the database gets bigger this becomes impractical.
Am I missing something? Cant I somehow specify where I want to restore the database? Would I need a different backup command?
#minaz answer was good, but I want to append a little bit more.
The problem was caused by --databases keyword. If you omit the keyword, it will not contain any database creation contents.
So, Dump without --databases keyword.
mysqldump -u username -p database_name > dump.sql
And restore it with the target database name.
mysql -u username -p target_database_name < dump.sql
Also, there are several ways to do this. See the similar problem on here (dba.stackexchange).
If you drop the option --databases but still specify the database name, you will NOT get the create database statements. ie:
mysqldump -u root --opt --skip-extended-insert my_production_db
On your dev machine simply create any database you wish to restore to.
If you already have your dump you can strip the commands for creating and using the database. Simply remove the fourth and the new fifth line.
sed '4d' dump.sql | sed '5d' > dump-striped.sql
On windows xampp I used following commands to achieve this
Export
mysqldump -u root -p mydb > mydb.sql
Import
mysql -u root -p mynewdb < mydb.sql

Skip database on import of MySQL dumpfile

I created a dumpfile with this command:
mysqldump -p3307 --quick -u root --password="password" --all-databases > all_databases04292011.sql
I then attempted to import this dumpfile into a new MySQL server, however it fails trying to write to the information_schema database. Is there a way to skip this database on import?
You can write a program editing the all_databases04292011.sql dumpfile, to delete all the records in information_schema database.
It is not that hard, since the dumpfile is well structured.
Just open all_databases04292011.sql using your favourite editor, then find
--
-- Current Database: `information_schema`
--
Delete every line below this until you see the next
--
-- Current Database: `xxxxxx`
--