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:
mysqldump does not dump the
INFORMATION_SCHEMA database by default. As of
MySQL 5.1.38, mysqldump dumps
INFORMATION_SCHEMA if you name it explicitly
on the command line, although currently you must also use the
option. Before 5.1.38, mysqldump silently
INFORMATION_SCHEMA even if you name
it explicitly on the command line.
Some mysqldump options are shorthand for groups of other options:
--opt is the same
--set-charset. All of the
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,
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, so to enable memory buffering, use
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 184.108.40.206.1, “Command-Line Options that Affect Option-File Handling”.
|--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 more compact 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 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 statements to disable and enable keys|
|--dump-date||dump-date||Include dump date as "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 --tab 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 --tab 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 --tab option and has the same meaning as the corresponding clause for LOAD DATA INFILE|
|--first-slave||first-slave||Deprecated; use --lock-all-tables instead|
|--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 IGNORE statements rather than INSERT statements|
|--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 dump table contents|
|--no-set-names||no-set-names||Same as --skip-set-charset|
|--opt||opt||Shorthand for --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset.|
|--order-by-primary||order-by-primary||Dump each table's rows sorted 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 identifiers 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 a DROP TABLE statement before each CREATE TABLE statement|
|--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||Do not produce more compact output|
|--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||Do not quote identifiers|
|--skip-set-charset||skip-set-charset||Suppress the SET NAMES statement|
|--skip-triggers||skip-triggers||Do not dump 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|
Display a help message and exit.
DROP DATABASE 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.
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.5, “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,
Prior to MySQL 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.
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.
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
-- Dump completed on
However, the date causes dump files taken at different times
to appear to be different, even if the data are otherwise
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
Include Event Scheduler events for the dumped databases in the output. 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.
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
PRIVILEGES statement to the server after dumping
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.
For each dumped database, lock all tables to be dumped
before dumping them. The tables are locked with
READ LOCAL to allow 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.
Log warnings and errors by appending them to the named file. The default is to do no logging. 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
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.
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.
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 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.
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 220.127.116.11, “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 via 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 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 identifiers (such as database, table, and column
names) within “
characters. If the
ANSI_QUOTES SQL mode is
enabled, identifiers 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
previous contents overwritten, even if an error occurs while
generating the dump.
Included stored routines (procedures and functions) for the
dumped databases in the output. Use of this option requires
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 sends a
TRANSACTION SQL statement to the server before
dumping data. It is useful only with transactional tables
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 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.
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
As of MySQL 5.1.38, column values are 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.
Include triggers for each dumped table in the output. 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
change if the servers are in different time zones.
--tz-utc also 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
a 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="273293" Max_data_length="18858823439613951" Index_length="43008" Data_free="0" Auto_increment="4080" Create_time="2007-03-31 01:47:01" Update_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
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.
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.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 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”.
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.