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.9, “mysqlhotcopy — A Database Backup Program”.
There are three general ways to invoke mysqldump:
Some mysqldump options are shorthand for
groups of other options.
--compact fall into this
category. For example, use of
--opt is the same as
--set-charset. Note that all
of the options that
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. For example, to disable extended inserts and memory
(As of MySQL 5.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
in MySQL 5.1; to enable memory buffering, use
|--add-drop-database||add-drop-database||Add a DROP DATABASE statement before each CREATE DATABASE statement|
|--add-drop-table||add-drop-table||Add a DROP TABLE statement before each CREATE TABLE statement|
|--add-locks||add-locks||Surround each table dump with LOCK TABLES and UNLOCK TABLES statements|
|--all-databases||all-databases||Dump all tables in all databases|
|--all-tablespaces||all-tablespaces||Adds to a table dump all SQL statements needed to create any tablespaces used by an NDB Cluster table||5.1.6|
|--allow-keywords||allow-keywords||Allow creation of column names that are keywords|
|--comments||comments||Add comments to the dump file|
|--compact||compact||Produce less verbose output|
|--compatible=name[,name,...]||compatible||Produce output that is more compatible with other database systems or with older MySQL servers|
|--complete-insert||complete-insert||Use complete INSERT statements that include column names|
|--create-options||create-options||Include all MySQL-specific table options in the CREATE TABLE statements|
|--databases||databases||Dump several databases|
|--debug[=debug_options]||debug||Write a debugging log|
|--debug-check||debug-check||Print debugging information when the program exits||5.1.21|
|--debug-info||debug-info||Print debugging information, memory and CPU statistics when the program exits||5.1.14|
|--default-character-set=charset_name||default-character-set||Use charset_name as the default character set|
|--delayed-insert||delayed-insert||Write INSERT DELAYED statements rather than INSERT statements|
|--delete-master-logs||delete-master-logs||On a master replication server, delete the binary logs after performing the dump operation|
|--disable-keys||disable-keys||For each table, surround the INSERT statements with disable and enable keys statements|
|--dump-date||dump-date||Include dump date in "Dump completed on" comment if --comments is given||5.1.23|
|--events||events||Dump events from the dumped databases||5.1.8|
|--extended-insert||extended-insert||Use multiple-row INSERT syntax that include several VALUES lists|
|--fields-enclosed-by=string||fields-enclosed-by||This option is used with the -T option and has the same meaning as the corresponding clause for LOAD DATA INFILE|
|--fields-escaped-by||fields-escaped-by||This option is used with the -T option and has the same meaning as the corresponding clause for LOAD DATA INFILE|
|--fields-optionally-enclosed-by=string||fields-optionally-enclosed-by||This option is used with the -T option and has the same meaning as the corresponding clause for LOAD DATA INFILE|
|--first-slave||first-slave||Deprecated. Now renamed to --lock-all-tables|
|--flush-logs||flush-logs||Flush the MySQL server log files before starting the dump|
|--flush-privileges||flush-privileges||Emit a FLUSH PRIVILEGES statement after dumping the mysql database|
|--help||Display help message and exit|
|--hex-blob||hex-blob||Dump binary columns using hexadecimal notation (for example, 'abc' becomes 0x616263)|
|--host||host||Host to connect to (IP address or hostname)|
|--ignore-table=db_name.tbl_name||ignore-table||Do not dump the given table|
|--insert-ignore||insert-ignore||Write INSERT statements with the IGNORE option|
|--lock-all-tables||lock-all-tables||Lock all tables across all databases|
|--lock-tables||lock-tables||Lock all tables before dumping them|
|--log-error=file_name||log-error||Append warnings and errors to the named file||5.1.18|
|--master-data[=value]||master-data||Write the binary log file name and position to the output|
|--max_allowed_packet=value||max_allowed_packet||The maximum packet length to send to or receive from the server|
|--net_buffer_length=value||net_buffer_length||The buffer size for TCP/IP and socket communication|
|--no-autocommit||no-autocommit||Enclose the INSERT statements for each dumped table within SET autocommit = 0 and COMMIT statements|
|--no-create-db||no-create-db||This option suppresses the CREATE DATABASE statements|
|--no-create-info||no-create-info||Do not write CREATE TABLE statements that re-create each dumped table|
|--no-data||no-data||Do not write any table row information (that is, do not dump table contents, only table definitions)|
|--no-set-names||no-set-names||Turn off complete-insert|
|--opt||opt||This option is shorthand; it is the same as specifying --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset.|
|--order-by-primary||order-by-primary||Sorts each table's rows by its primary key, or by its first unique index|
|--password[=password]||password||The password to use when connecting to the server|
|--pipe||On Windows, connect to server via a named pipe|
|--port=port_num||port||The TCP/IP port number to use for the connection|
|--quick||quick||Retrieve rows for a table from the server a row at a time|
|--quote-names||quote-names||Quote database, table, and column names within backtick characters|
|--replace||replace||Write REPLACE statements rather than INSERT statements||5.1.3|
|--result-file=file||result-file||Direct output to a given file|
|--routines||routines||Dump stored routines (procedures and functions) from the dumped databases||5.1.2|
|--set-charset||set-charset||Add SET NAMES default_character_set to the output|
|--single-transaction||single-transaction||This option issues a BEGIN SQL statement before dumping data from the server|
|--skip-add-drop-table||skip-add-drop-table||Do not add|
|--skip-add-locks||skip-add-locks||Do not add locks|
|--skip-comments||skip-comments||Do not add comments to the dump file|
|--skip-compact||skip-compact||Turn off compact|
|--skip-disable-keys||skip-disable-keys||Do not disable keys|
|--skip-extended-insert||skip-extended-insert||Turn off extended-insert|
|--skip-opt||skip-opt||Turn off the options set by opt|
|--skip-quick||skip-quick||Do not retrieve rows for a table from the server a row at a time|
|--skip-quote-names||skip-quote-names||Turn off quote names|
|--skip-set-charset||skip-set-charset||Suppress the SET NAMES statement|
|--skip-triggers||skip-triggers||Turn off triggers|
|--skip-tz-utc||skip-tz-utc||Turn off tz-utc||5.1.2|
|--ssl-ca=file_name||ssl-ca||The path to a file that contains a list of trusted SSL CAs|
|--ssl-capath=directory_name||ssl-capath||The path to a directory that contains trusted SSL CA certificates in PEM format|
|--ssl-cert=file_name||ssl-cert||The name of the SSL certificate file to use for establishing a secure connection|
|--ssl-cipher=cipher_list||ssl-cipher||A list of allowable ciphers to use for SSL encryption|
|--ssl-key=file_name||ssl-key||The name of the SSL key file to use for establishing a secure connection|
|--ssl-verify-server-cert||ssl-verify-server-cert||The server's Common Name value in its certificate is verified against the host name used when connecting to the server|
|--tab=path||tab||Produce tab-separated data files|
|--tables||tables||Override the --databases or -B option|
|--triggers||triggers||Dump triggers for each dumped table|
|--tz-utc||tz-utc||Add SET TIME_ZONE='+00:00' to the dump file||5.1.2|
|--version||Display version information and exit|
|--where='where_condition'||where||Dump only rows selected by the given WHERE condition|
|--xml||xml||Produce XML output|
mysqldump supports the options in the following list. It also reads option files and supports the options for processing them described at Section 22.214.171.124.1, “Command-Line Options that Affect Option-File Handling”.
Display a help message and exit.
Dump all tables in all databases. This is the same as using
--databases option and
naming all the databases on the command line.
Adds to a table dump all SQL statements needed to create any
tablespaces used by an
NDBCLUSTER table. This
information is not otherwise included in the output from
mysqldump. This option is currently
relevant only to MySQL Cluster tables.
This option was added in MySQL 5.1.6.
Allow 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.2, “The Character Set Used for Data and Sorting”.
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,
Prior to release 5.1.21, this option did not create valid
SQL if the database dump contained views. The recreation
of views requires the creation and removal of temporary
tables and this option suppressed the removal of those
temporary tables. As a workaround, use
--compact with the
and then manually adjust the dump file.
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.8, “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.
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
Print some debugging information when the program exits. This option was added in MySQL 5.1.21.
Print debugging information and memory and CPU usage statistics when the program exits. This option was added in MySQL 5.1.14.
charset_name as the default
character set. See Section 9.2, “The Character Set Used for Data and Sorting”.
If no character set is specified,
and earlier versions use
Prior to MySQL 5.1.38, this option has no effect for output
data files produced by using the
--tab option. See the
description for that option.
On a master replication server, delete the binary logs after
performing the dump operation. This option automatically
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
faster because the indexes are created after all rows are
inserted. This option is effective only for nonunique
tbl_name ENABLE KEYS
mysqldump produces a
comment at the end of the dump if the
--comments option is
given. However, the date causes dump files for identical
data take at different times to appear to be different.
control whether the date is added to the comment. The
(include the date in the comment).
suppresses date printing. This option was added in MySQL
Dump events from the dumped databases. This option was added in MySQL 5.1.8.
syntax that include several
This results in a smaller dump file and speeds up inserts
when the file is reloaded.
Deprecated. Now renamed to
Flush the MySQL server log files before starting the dump.
This option requires the
RELOAD privilege. Note that
if you use this option in combination with the
-A) option, 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
PRIVILEGES statement after dumping the
mysql database. This option should be
used any time the dump contains the
database and any other database that depends on the data in
mysql database for proper
restoration. This option was added in MySQL 5.1.12.
Continue even if an SQL error occurs during a table dump.
One use for this option is to cause
mysqldump to continue executing even when
it encounters a view that has become invalid because the
definition refers to a table that has been dropped. Without
mysqldump exits with an error message.
mysqldump prints the error message, but
it also writes an SQL comment containing the view definition
to the dump output and continues executing.
Dump data from the MySQL server on the given host. The
default host is
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 also can be used to ignore views.
INSERT statements with
Lock all tables before dumping them. The tables are locked
READ LOCAL to allow concurrent
inserts in the case of
MyISAM tables. For
transactional tables such as
--single-transaction is a
much better option, because it does not need to lock the
tables at all.
Please note that when dumping multiple databases,
--lock-tables locks tables
for each database separately. Therefore, 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.
Append warnings and errors to the named file. This option was added in MySQL 5.1.18.
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
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
takes effect when the dump file is reloaded. If the option
value is not specified, the default value is 1.
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 SHOW SLAVE STATUS statement, get the binary log coordinates of the master server from which the new slave should start replicating. These coordinates are the values of the Relay_Master_Log_File and Exec_Master_Log_Pos values. Denote those values as file_name and file_pos.
Dump the slave server:
mysqldump --master-data=2 --all-databases > dumpfile
Restart the slave:
On the new slave, reload 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 = file_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 very useful if you want to dump
statement for the table.
This option is deprecated. Use
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.
is enabled by default. Use
--skip-opt to disable
it. See the discussion at the beginning of this
section for information about selectively enabling or
disabling certain of the options affected by
Sort each table's rows by its primary key, or by its first
unique index, if such an index exists. This is useful when
MyISAM table to be loaded into
InnoDB table, but will make the dump
itself take considerably longer.
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, you are
prompted for one.
Specifying a password on the command line should be considered insecure. See Section 126.96.36.199, “End-User Guidelines for Password Security”.
On Windows, connect to the server via a named pipe. This option applies only for connections to a local server, and 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 allowable values, see Section 4.2.2, “Connecting to the MySQL Server”.
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 database, table, and column names within
`” characters. If the
ANSI_QUOTES SQL mode is
enabled, names are quoted within
"” characters. This option
is 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
contents overwritten, even if an error occurs while
generating the dump. The previous contents are lost.
Dump stored routines (procedures and functions) from the
dumped databases. Use of this option requires the
SELECT privilege for the
mysql.proc table. The output generated by
CREATE PROCEDURE and
CREATE FUNCTION statements to
re-create the routines. However, these statements do not
include attributes such as the routine creation and
modification timestamps. This means that when the routines
are reloaded, they will be created with the timestamps equal
to the reload time.
If you require routines to be re-created with their original
timestamp attributes, do not use
--routines. Instead, dump
and reload the contents of the
table directly, using a MySQL account that has appropriate
privileges for the
This option was added in MySQL 5.1.2. Before that, stored
routines are not dumped. Routine
values are not dumped until MySQL 5.1.8. This means that
before 5.1.8, when routines are reloaded, they will be
created with the definer set to the reloading user. If you
require routines to be re-created with their original
definer, dump and load the contents of the
mysql.proc table directly as described
to the output. This option is enabled by default. To
SET NAMES statement, use
This option issues a
statement before dumping data from the server. It is useful
only with transactional tables such as
InnoDB, 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 position), no other connection
should use the following statements:
TABLE. A consistent read is not isolated from
those statements, so use of them on a table to be dumped can
SELECT performed by
mysqldump to retrieve the table contents
to obtain incorrect contents or fail.
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.
To dump large tables, you should combine this option with
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 data files. For each dumped table,
mysqldump creates a
file that contains the
TABLE statement that creates the table, and a
file that contains its data. The option value is the
directory in which to write the files.
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
As of MySQL 5.1.38, column values are written converted to
the character set specified by the
option. Prior to 5.1.38 or if no such option is present,
values are dumped using the
character set. 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.
Dump triggers for each dumped table. This option is enabled
by default; disable it with
This option enables
columns to be dumped and reloaded between servers in
different time zones. mysqldump sets its
connection time zone to UTC and adds
TIME_ZONE='+00:00' to the dump file. Without this
TIMESTAMP columns are
dumped and reloaded in the time zones local to the source
and destination servers, which can cause the values to
protects against changes due to daylight saving time.
--tz-utc is enabled by
default. To disable it, use
This option was added in MySQL 5.1.2.
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.
'NULL', and Empty Values: For
some column named
NULL value, an empty string, and the
'NULL' are distinguished
from one another in the output generated by this option as
Beginning with MySQL 5.1.18, XML output from mysqldump includes the XML namespace, as shown here:
mysqldump --xml -u root world City<?xml version="1.0"?> <mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <database name="world"> <table_structure name="City"> <field Field="ID" Type="int(11)" Null="NO" Key="PRI" Extra="auto_increment" /> <field Field="Name" Type="char(35)" Null="NO" Key="" Default="" Extra="" /> <field Field="CountryCode" Type="char(3)" Null="NO" Key="" Default="" Extra="" /> <field Field="District" Type="char(20)" Null="NO" Key="" Default="" Extra="" /> <field Field="Population" Type="int(11)" Null="NO" Key="" Default="0" Extra="" /> <key Table="City" Non_unique="0" Key_name="PRIMARY" Seq_in_index="1" Column_name="ID" Collation="A" Cardinality="4079" Null="" Index_type="BTREE" Comment="" /> <options Name="City" Engine="MyISAM" Version="10" Row_format="Fixed" Rows="4079" Avg_row_length="67" Data_length="27329 3" Max_data_length="18858823439613951" Index_length="43008" Data_free="0" Auto_increment="4080" Create_time="2007-03-31 01:47:01" Updat e_time="2007-03-31 01:47:02" Collation="latin1_swedish_ci" Create_options="" Comment="" /> </table_structure> <table_data name="City"> <row> <field name="ID">1</field> <field name="Name">Kabul</field> <field name="CountryCode">AFG</field> <field name="District">Kabol</field> <field name="Population">1780000</field> </row>
...<row> <field name="ID">4079</field> <field name="Name">Rafah</field> <field name="CountryCode">PSE</field> <field name="District">Rafah</field> <field name="Population">92020</field> </row> </table_data> </database> </mysqldump>
You can also set the following variables by using
The maximum size of the buffer for client/server communication. The maximum is 1GB.
The initial size of the buffer for client/server
communication. When creating multiple-row-insert statements
(as with option
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.
The most common use of mysqldump is probably for making a backup of an entire database:
You can read 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.2.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, which provides a convenient way to
make an online backup suitable for point-in-time recovery if
tables are stored using the
For more information on making backups, see Section 6.1, “Database Backups”, and Section 6.2, “Example Backup and Recovery Strategy”.
If you encounter problems backing up views, please read the section that covers restrictions on views which describes a workaround for backing up views when this fails due to insufficient privileges. See Section D.4, “Restrictions on Views”.
MySQL Enterprise. MySQL Enterprise subscribers will find more information about mysqldump in the Knowledge Base article, How Can I Avoid Inserting Duplicate Rows From a Dump File?. Access to the MySQL Knowledge Base collection of articles is one of the advantages of subscribing to MySQL Enterprise. For more information, see http://www.mysql.com/products/enterprise/advisors.html.