The mysqldump client is a backup program originally written by Igor Romanenko. It can be used to dump a database or a collection of databases for backup or transfer to another SQL server (not necessarily a MySQL server). The dump typically contains SQL statements to create the table, populate it, or both. However, mysqldump can also be used to generate files in CSV, other delimited text, or XML format.
If you are doing a backup on the server and your tables all are
MyISAM tables, consider using the
mysqlhotcopy instead because it can
accomplish faster backups and faster restores. See
Section 4.6.8, “mysqlhotcopy — A Database Backup Program”.
There are three general ways to invoke mysqldump:
Some mysqldump options are shorthand for groups of other options:
--opt is the same
--set-charset. As of MySQL
4.1, all of the options that
--opt stands for also are
on by default because
--opt is on by default.
To reverse the effect of a group option, uses its
It is also possible to select only part of the effect of a group
option by following it with options that enable or disable
specific features. Here are some examples:
To select the effect of
--opt except for some
features, use the
--skip option for each
feature. To disable extended inserts and memory buffering,
(As of MySQL 4.1,
is sufficient because
--opt is on by default.)
When you selectively enable or disable the effect of a group
option, order is important because options are processed first
to last. For example,
--skip-opt would not have the
intended effect; it is the same as
--skip-opt by itself.
mysqldump can retrieve and dump table
contents row by row, or it can retrieve the entire content from
a table and buffer it in memory before dumping it. Buffering in
memory can be a problem if you are dumping large tables. To dump
tables row by row, use the
--quick option (or
--opt, which enables
--opt option (and hence
--quick) is enabled by default
as of MySQL 4.1, so to enable memory buffering, use
Before MySQL 4.1.2, out-of-range numeric values such as
inf, as well as
NaN (not-a-number) values are dumped by
NULL. You can
see this using the following sample table:
CREATE TABLE t (f DOUBLE);mysql>
INSERT INTO t VALUES(1e+111111111111111111111);mysql>
INSERT INTO t VALUES(-1e111111111111111111111);mysql>
SELECT f FROM t;+------+ | f | +------+ | inf | | -inf | +------+
For this table, mysqldump produces the following data output:
-- -- Dumping data for table `t` -- INSERT INTO t VALUES (NULL); INSERT INTO t VALUES (NULL);
The significance of this behavior is that if you dump and
restore the table, the new table has contents that differ from
the original contents. This problem is fixed as of MySQL 4.1.2;
you cannot insert
inf in the table, so this
mysqldump behavior is only relevant when you
deal with old servers.
mysqldump supports the following options,
which can be specified on the command line or in the
option file groups. mysqldump also supports
the options for processing option files described at
Section 18.104.22.168.1, “Command-Line Options that Affect Option-File Handling”.
|--add-drop-database||Add a DROP DATABASE statement before each CREATE DATABASE statement||4.1.13|
|--add-drop-table||Add a DROP TABLE statement before each CREATE TABLE statement|
|--add-locks||Surround each table dump with LOCK TABLES and UNLOCK TABLES statements|
|--all-databases||Dump all tables in all databases|
|--allow-keywords||Allow creation of column names that are keywords|
|--comments||Add comments to the dump file|
|--compact||Produce more compact output|
|--compatible=name[,name,...]||Produce output that is more compatible with other database systems or with older MySQL servers|
|--complete-insert||Use complete INSERT statements that include column names|
|--create-options||Include all MySQL-specific table options in CREATE TABLE statements|
|--databases||Dump several databases|
|--debug[=debug_options]||Write a debugging log|
|--default-character-set=charset_name||Specify default character set|
|--defaults-extra-file=file_name||Read option file in addition to usual option files|
|--defaults-file=file_name||Read only named option file|
|--delayed-insert||Write INSERT DELAYED statements rather than INSERT statements|
|--delete-master-logs||On a master replication server, delete the binary logs after performing the dump operation|
|--disable-keys||For each table, surround the INSERT statements with statements to disable and enable keys|
|--extended-insert||Use multiple-row INSERT syntax that include several VALUES lists|
|--fields-enclosed-by=string||This option is used with the --tab option and has the same meaning as the corresponding clause for LOAD DATA INFILE|
|--fields-escaped-by||This option is used with the --tab option and has the same meaning as the corresponding clause for LOAD DATA INFILE|
|--fields-optionally-enclosed-by=string||This option is used with the --tab option and has the same meaning as the corresponding clause for LOAD DATA INFILE|
|--first-slave||Deprecated; use --lock-all-tables instead||4.1.0|
|--flush-logs||Flush the MySQL server log files before starting the dump|
|--help||Display help message and exit|
|--hex-blob||Dump binary columns using hexadecimal notation (for example, 'abc' becomes 0x616263)|
|--host||Host to connect to (IP address or hostname)|
|--ignore-table=db_name.tbl_name||Do not dump the given table|
|--insert-ignore||Write INSERT IGNORE statements rather than INSERT statements||4.1.12|
|--lock-all-tables||Lock all tables across all databases|
|--lock-tables||Lock all tables before dumping them|
|--master-data[=value]||Write the binary log file name and position to the output|
|--max_allowed_packet=value||Maximum packet length to send to or receive from server|
|--net_buffer_length=value||Buffer size for TCP/IP and socket communication|
|--no-autocommit||Enclose the INSERT statements for each dumped table within SET autocommit = 0 and COMMIT statements|
|--no-create-db||This option suppresses the CREATE DATABASE statements|
|--no-create-info||Do not write CREATE TABLE statements that re-create each dumped table|
|--no-data||Do not dump table contents|
|--no-defaults||Read no option files|
|--no-set-names||Same as --skip-set-charset||4.1.0|
|--opt||Shorthand for --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset.|
|--order-by-primary||Dump each table's rows sorted by its primary key, or by its first unique index|
|--password[=password]||Password to use when connecting to server|
|--pipe||On Windows, connect to server using named pipe|
|--port=port_num||TCP/IP port number to use for connection|
|--protocol=type||Connection protocol to use|
|--quick||Retrieve rows for a table from the server a row at a time|
|--quote-names||Quote identifiers within backtick characters|
|--result-file=file||Direct output to a given file|
|--set-charset||Add SET NAMES default_character_set to output|
|--shared-memory-base-name=name||The name of shared memory to use for shared-memory connections|
|--single-transaction||This option issues a BEGIN SQL statement before dumping data from the server|
|--skip-add-drop-table||Do not add a DROP TABLE statement before each CREATE TABLE statement|
|--skip-add-locks||Do not add locks|
|--skip-comments||Do not add comments to the dump file|
|--skip-compact||Do not produce more compact output|
|--skip-disable-keys||Do not disable keys|
|--skip-extended-insert||Turn off extended-insert|
|--skip-opt||Turn off the options set by --opt|
|--skip-quick||Do not retrieve rows for a table from the server a row at a time|
|--skip-quote-names||Do not quote identifiers|
|--skip-set-charset||Suppress the SET NAMES statement|
|--socket=path||For connections to localhost, the Unix socket file to use|
|--ssl||Enable SSL for connection|
|--ssl-ca=file_name||Path of file that contains list of trusted SSL CAs|
|--ssl-capath=dir_name||Path of directory that contains trusted SSL CA certificates in PEM format|
|--ssl-cert=file_name||Path of file that contains X509 certificate in PEM format|
|--ssl-cipher=cipher_list||List of permitted ciphers to use for SSL encryption|
|--ssl-key=file_name||Path of file that contains X509 key in PEM format|
|--tab=path||Produce tab-separated data files|
|--tables||Override the --databases or -B option|
|--user=user_name||MySQL user name to use when connecting to server|
|--version||Display version information and exit|
|--where='where_condition'||Dump only rows selected by the given WHERE condition|
|--xml||Produce XML output|
Display a help message and exit.
DROP TABLE statement
statement. This option is typically used in conjunction with
--databases option because
CREATE DATABASE statements
are written unless one of those options is specified.
Dump all tables in all databases. This is the same as using
--databases option and
naming all the databases on the command line.
Permit creation of column names that are keywords. This works by prefixing each column name with the table name.
The directory where character sets are installed. See Section 9.6, “Character Set Configuration”.
Write additional information in the dump file such as
program version, server version, and host. This option is
enabled by default. To suppress this additional information,
option was added in MySQL 4.0.17.
Produce output that is more compatible with other database
systems or with older MySQL servers. The value of
name can be
no_field_options. To use several values,
separate them by commas. These values have the same meaning
as the corresponding options for setting the server SQL
mode. See Section 5.1.6, “Server SQL Modes”.
This option does not guarantee compatibility with other
servers. It only enables those SQL mode values that are
currently available for making dump output more compatible.
not map data types to Oracle types or use Oracle comment
This option requires a server version of 4.1.0 or higher. With older servers, it does nothing.
statements that include column names.
Compress all information sent between the client and the server if both support compression.
Include all MySQL-specific table options in the
CREATE TABLE statements.
Before MySQL 4.1.2, use
Dump several databases. Normally,
mysqldump treats the first name argument
on the command line as a database name and following names
as table names. With this option, it treats all name
arguments as database names.
statements are included in the output before each new
Write a debugging log. A typical
debug_options string is
The default value is
charset_name as the default
character set. See Section 9.6, “Character Set Configuration”.
If no character set is specified,
mysqldump from MySQL 4.1.2 or later uses
utf8, and earlier versions use
On a master replication server, delete the binary logs by
statement to the server after performing the dump operation.
This option automatically enables
--first-slave before MySQL
4.1.8 and enables
It was added in MySQL 3.23.57 (for MySQL 3.23) and MySQL
4.0.13 (for MySQL 4.0).
For each table, surround the
INSERT statements with
/*!40000 ALTER TABLE
tbl_name DISABLE KEYS
/*!40000 ALTER TABLE
statements. This makes loading the dump file
into a MySQL 4.0 or newer server faster because the indexes
are created after all rows are inserted. This option is
effective only for nonunique indexes of
tbl_name ENABLE KEYS
MyISAM tables. only.
syntax that include several
This results in a smaller dump file and speeds up inserts
when the file is reloaded.
as of MySQL 4.1.8.
Flush the MySQL server log files before starting the dump.
This option requires the
RELOAD privilege. If you use
this option in combination with the
the logs are flushed for each database
dumped. The exception is when using
--master-data: In this
case, the logs are flushed only once, corresponding to the
moment that all tables are locked. If you want your dump and
the log flush to happen at exactly the same moment, you
together with either
Continue even if an SQL error occurs during a table dump.
Dump data from the MySQL server on the given host. The
default host is
Dump binary columns using hexadecimal notation (for example,
0x616263). The affected data types are
VARBINARY, and the
BLOB types in MySQL 4.1 and
MySQL 4.0. This option was added in MySQL 4.0.23 and 4.1.8.
Do not dump the given table, which must be specified using both the database and table names. To ignore multiple tables, use this option multiple times. This option was added in MySQL 4.1.9.
Lock all tables across all databases. This is achieved by
acquiring a global read lock for the duration of the whole
dump. This option automatically turns off
--lock-tables. Added in
For each dumped database, lock all tables to be dumped
before dumping them. The tables are locked with
READ LOCAL to permit concurrent inserts
in the case of
MyISAM tables. For
transactional tables such as
--single-transaction is a
much better option than
--lock-tables because it
does not need to lock the tables at all.
locks tables for each database separately, this option does
not guarantee that the tables in the dump file are logically
consistent between databases. Tables in different databases
may be dumped in completely different states.
This option has no effect for output data files produced by
See the description for that option.
Use this option to dump a master replication server to
produce a dump file that can be used to set up another
server as a slave of the master. It causes the dump output
to include a
CHANGE MASTER TO
statement that indicates the binary log coordinates (file
name and position) of the dumped server. These are the
master server coordinates from which the slave should start
replicating after you load the dump file into the slave.
If the option value is 2, the
MASTER TO statement is written as an SQL comment,
and thus is informative only; it has no effect when the dump
file is reloaded. If the option value is 1, the statement is
not written as a comment and takes effect when the dump file
is reloaded. If no option value is specified, the default
value is 1. The value may be given as of MySQL 4.1.8; before
that, do not specify an option value.
This option requires the
RELOAD privilege and the
binary log must be enabled.
automatically turns off
--lock-tables. It also
is specified, in which case, a global read lock is acquired
only for a short time at the beginning of the dump (see the
all cases, any action on logs happens at the exact moment of
It is also possible to set up a slave by dumping an existing slave of the master. To do this, use the following procedure on the existing slave:
Stop the slave's SQL thread and get its current status:
STOP SLAVE SQL_THREAD;mysql>
SHOW SLAVE STATUS;
From the output of the
STATUS statement, the binary log coordinates
of the master server from which the new slave should
start replicating are the values of the
Exec_Master_Log_Pos fields. Denote
those values as
Dump the slave server:
mysqldump --master-data=2 --all-databases > dumpfile
Restart the slave:
On the new slave, load the dump file:
mysql < dumpfile
On the new slave, set the replication coordinates to those of the master server obtained earlier:
CHANGE MASTER TO->
MASTER_LOG_FILE = '
file_name', MASTER_LOG_POS =
CHANGE MASTER TO
statement might also need other parameters, such as
MASTER_HOST to point the slave to the
correct master server host. Add any such parameters as
Do not write
statements that re-create each dumped table.
Do not write any table row information (that is, do not dump
table contents). This is useful if you want to dump only the
CREATE TABLE statement for
the table (for example, to create an empty copy of the table
by loading the dump file).
This has the same effect as
This option is shorthand. It is the same as specifying
--set-charset. It should
give you a fast dump operation and produce a dump file that
can be reloaded into a MySQL server quickly.
As of MySQL 4.1,
--opt is enabled by
disable it. See the discussion at the beginning
of this section for information about selectively enabling
or disabling a subset of the options affected by
Dump each table's rows sorted by its primary key, or by its
first unique index, if such an index exists. This is useful
when dumping a
MyISAM table to be loaded
InnoDB table, but will make the
dump operation take considerably longer. This option was
added in MySQL 4.1.8.
The password to use when connecting to the server. If you
use the short option form (
cannot have a space between the option
and the password. If you omit the
password value following the
-p option on the command line,
mysqldump prompts for one.
Specifying a password on the command line should be considered insecure. See Section 22.214.171.124, “End-User Guidelines for Password Security”. You can use an option file to avoid giving the password on the command line.
On Windows, connect to the server using a named pipe. This option applies only if the server supports named-pipe connections.
The TCP/IP port number to use for the connection.
The connection protocol to use for connecting to the server. It is useful when the other connection parameters normally would cause a protocol to be used other than the one you want. For details on the permissible values, see Section 4.2.2, “Connecting to the MySQL Server”. This option was added in MySQL 4.1.
This option is useful for dumping large tables. It forces mysqldump to retrieve rows for a table from the server a row at a time rather than retrieving the entire row set and buffering it in memory before writing it out.
Quote identifiers (such as database, table, and column
names) within “
characters. If the
ANSI_QUOTES SQL mode is
enabled, identifiers are quoted within
"” characters. As of MySQL
enabled by default. It can be disabled with
but this option should be given after any option such as
--compatible that may
Direct output to a given file. This option should be used on
Windows to prevent newline
\n” characters from being
converted to “
return/newline sequences. The result file is created and its
previous contents overwritten, even if an error occurs while
generating the dump.
to the output. This option is enabled by default. To
SET NAMES statement, use
This option was added in MySQL 4.1.2.
This option sends a
TRANSACTION SQL statement to the server before
dumping data. It is useful only with transactional tables
BDB, because then it dumps the consistent
state of the database at the time when
issued without blocking any applications.
When using this option, you should keep in mind that only
InnoDB tables are dumped in a consistent
state. For example, any
MEMORY tables dumped while using this
option may still change state.
is in process, to ensure a valid dump file (correct table
contents and binary log coordinates), no other connection
should use the following statements:
TRUNCATE TABLE. A consistent
read is not isolated from those statements, so use of them
on a table to be dumped can cause the
SELECT that is performed by
mysqldump to retrieve the table contents
to obtain incorrect contents or fail.
option was added in MySQL 4.0.2. This option is mutually
exclusive with the
LOCK TABLES causes
any pending transactions to be committed implicitly.
This option is not supported for MySQL Cluster tables; the
results cannot be guaranteed to be consistent due to the
fact that the
storage engine supports only the
READ_COMMITTED transaction isolation
level. You should always use
NDB backup and restore instead.
See the description for the
See the description for the
For connections to
localhost, the Unix
socket file to use, or, on Windows, the name of the named
pipe to use.
Produce tab-separated text-format data files. For each
dumped table, mysqldump creates a
file that contains the
TABLE statement that creates the table, and the
server writes a
file that contains its data. The option value is the
directory in which to write the files.
This option should be used only when
mysqldump is run on the same machine as
the mysqld server. You must have the
FILE privilege, and the
server must have permission to write files in the
directory that you specify.
By default, the
.txt data files are
formatted using tab characters between column values and a
newline at the end of each line. The format can be specified
explicitly using the
Column values are dumped using the
character set and the
option is ignored. In effect, there is no character set
conversion. If a table contains columns in several character
sets, the output data file will as well and you may not be
able to reload the file correctly.
The MySQL user name to use when connecting to the server.
Verbose mode. Print more information about what the program does.
Display version information and exit.
Dump only rows selected by the given
WHERE condition. Quotes around the
condition are mandatory if it contains spaces or other
characters that are special to your command interpreter.
--where="user='jimf'" -w"userid>1" -w"userid<1"
Write dump output as well-formed XML.
You can also set the following variables by using
The maximum size of the buffer for client/server communication. The default is 24MB. The maximum can be up to 16MB before MySQL 4.0, and up to 1GB from MySQL 4.0 on.
The initial size of the buffer for client/server
communication. When creating multiple-row
INSERT statements (as with
mysqldump creates rows up to
If you increase this variable, you should also ensure that
variable in the MySQL server is at least this large.
It is also possible to set variables by using
syntax. However, this syntax is deprecated as of MySQL 4.0.
A common use of mysqldump is for making a backup of an entire database:
You can load the dump file back into the server like this:
Or like this:
mysql -e "source
mysqldump is also very useful for populating databases by copying data from one MySQL server to another:
db_name| mysql --host=
It is possible to dump several databases with one command:
db_name2...] > my_databases.sql
To dump all databases, use the
mysqldump --all-databases > all_databases.sql
mysqldump provides a way of making an online
mysqldump --all-databases --single-transaction > all_databases.sql
This backup acquires a global read lock on all tables (using
FLUSH TABLES WITH READ
LOCK) at the beginning of the dump. As soon as this
lock has been acquired, the binary log coordinates are read and
the lock is released. If long updating statements are running
FLUSH statement is
issued, the MySQL server may get stalled until those statements
finish. After that, the dump becomes lock free and does not
disturb reads and writes on the tables. If the update statements
that the MySQL server receives are short (in terms of execution
time), the initial lock period should not be noticeable, even
with many updates.
For point-in-time recovery (also known as “roll-forward,” when you need to restore an old backup and replay the changes that happened since that backup), it is often useful to rotate the binary log (see Section 5.3.4, “The Binary Log”) or at least know the binary log coordinates to which the dump corresponds:
mysqldump --all-databases --master-data=2 > all_databases.sql
mysqldump --all-databases --flush-logs --master-data=2
can be used simultaneously as of MySQL 4.1.8, which provides a
convenient way to make an online backup suitable for use prior
to point-in-time recovery if tables are stored using the
InnoDB storage engine.
For more information on making backups, see Section 6.2, “Database Backup Methods”, and Section 6.3, “Example Backup and Recovery Strategy”.