mysqldump命令执行时,可以将数据库备份成一个文本文件,该文件实际上包含了多个CREATE和INSERT语句,使用这些语句可以重新创建表和插入数据。
mysqldump备份单个数据库语句,基本语法格式如下:
mysqldump -u user -h host -p dbname [tbname1 [tbname2...] ] > filename.sql
tbname为dbname数据库中需要备份的数据表,可以指定多个需要备份的表,多个表名之间用空格隔开;
右箭头符号 “>” 告诉mysqldump将备份的数据表的定义和数据写入备份文件;
filename.sql为备份文件的名称。
mysqldump备份多个数据库语句,基本语法格式如下:
mysqldump -u user -h host -p --databases [dbnane1 [dbname2...]] > filename.sql
使用 --databases 参数之后,必须指定至少一个数据库的名称,多个数据库名称之间用空格隔开。
另外,使用 --all-databases 参数可以备份系统中所有的数据库,语句如下:
mysqldump -u user -h host -p --all-databases > filename.sql
备份文件包含的信息:
文件开头首先标明备份文件使用的mysqldump工具的版本号;
SET语句:这些语句将一些系统变量赋给用户定义变量,以确保被恢复的数据库的系统变量和原来备份时的变量相同;
以 “--” 字符开头的语句为行为注释语句;
以 “/*!” 开头、“*/” 结尾的语句为可执行的MySQL注释,这些语句可以被MySQL执行,但在其他数据库管理系统将被作为注释忽略,这可以提高数据库的可移植性。
以数字开头的语句,这些数字代表了MySQL版本号,该数字表明这些语句只有在指定的MySQL版本或者比该版本高的情况下才能执行。
例如:
/*!40101 SET CHARACTER_SET_CLIENT = @OLD_CHARACTER_SET_CLIENT */
表明这个语句只有在MySQL版本号为4.01.01或者更高的条件下才可以执行。
mysqldump提供许多选项,允许帮助命令 mysqldump --help
,可以获得特定版本的完整选项列表。
提示:
如果在服务器上进行备份,并且表均为MyISAM表,应考虑使用mysqlhotcopy,因为可以更快地进行备份和恢复。
如果使用最新版本的mysqldump程序备份数据,并用于恢复到比较旧版本的MySQL服务器中,则不要使用 --opt 或 -e 选项。
--opt:该选项是速记,等同于指定 --add-drop-tables
、 --add-locking
、 --create-option
、--disable-keys
、--extended-insert
、--lock-tables-quick
和 --set-charset
。它可以快速进行转储操作并产生一个能很快装入MySQL服务器的转储文件。该选项默认开启,但可以用--skip-opt
禁用。
--extended-insert,-e:使用包括几个VALUES列表的多行INSERT语法。这样使转储文件更小,重载文件时可以加速插入。
mysqlhotcopy是一个Perl脚本。它使用LOCK TABLES
、FLUSH TABLES
和 cp
或 scp
来快速备份数据库。它是备份数据库或单个表的最快途径,但它只能运行在数据库目录所在的机器上,并且只能备份MyISAM类型的表。mysqlhotcopy在UNIX系统中运行。
mysqlhotcopy命令语法格式如下:
mysqlhotcopy db_name_1,...db_name_n /path/to/new_directory
/path/to/new_directory 指定备份文件目录。
执行mysqlhotcopy,必须可以访问备份的表文件,具有那些表的SELECT权限、RELOAD权限(以便能够执行 FLUSH TABLES
)和 LOCK TABLES
权限。
提示:mysqlhotcopy只是将表所在的目录复制到另一个位置,只能用于备份MyISAM和ARCHIVE表。备份InnoDB类型的数据表时会出现错误信息。由于它复制本地格式的文件,因此也不能移植到其他硬件或操作系统下。
备份的sql文件中包含CREATE、INSERT语句。MySQL命令可以直接执行文件中的这些语句。其语法如下:
mysql -u user -p [dbname] < filename.sql
执行该语句前,必须先在MySQL服务器中创建指定数据库。
在已经登录MySQL服务器下,使用source命令导入sql文件。source语句语法如下:
source filename
执行该语句前,必须使用use语句选择数据库。且filename中路径分隔符用反斜杠 “\” 。
mysqlhotcopy备份后的文件也可以用来恢复数据库,在MySQL服务器停止运行时,将备份的数据库文件复制到MySQL存放数据的位置(MySQL的data文件夹),重新启动MySQL服务器即可。执行该操作前需要指定数据库文件的所有者,输入语句如下:
chown -R mysql.mysql /var/lib/mysql/dbname
从mysqlhotcopy复制的备份恢复到数据库,输入语句如下:
cp -R 备份文件所在路径 usr/local/mysql/data
执行完该语句,重启服务器,MySQL将恢复到备份状态。
提示:如果需要恢复的数据库已经存在,则需使用DROP语句输出已经存在的数据库之后恢复才能成功。另外,MySQL不同版本之间必须兼容,恢复之后的数据才可以使用。
最常用和最安全的方式是使用mysqldump命令导出数据,然后在目标数据库服务器使用MySQL命令导入。
将A主机上的MySQL数据库全部迁移到B主机上的执行命令如下:
mysqldump -h A -uroot -ppassword dbname |
mysql -h B -uroot -ppassword
mysqldump导入的数据直接通过管道符 “|” 传给MySQL命令导入到主机B数据库中;
dbname为需要迁移的数据库名称,如果要迁移全部数据库,可使用参数 --all-databases 。
SELECT columnlist FROM table WHERE condition INTO OUTFILE 'filename' [OPTIONS]
--OPTIONS 选项
FIELDS TERMINATED BY 'value'
FIELDS [OPTIONALLY] ENCLOSED BY 'value'
FIELDS ESCAPED BY 'value'
LINES STARTING BY 'value'
LINES TERMINATED BY 'value'
[OPTIONS] 为可选参数选项。OPTIONS部分的语法包括FIELDS和LINES子句,可能的取值有:
FIELDS和LINES两个子句都是自选的,但是如果两个都被指定了,FIELDS必须位于LINES的前面。
SELECT...INTO OUTFILE
语句可以非常快速地把一个表转储到服务器上。如果想要在服务器主机之外的部分客户主机上创建结果文件,不能使用SELECT...INTO OUTFILE
。在这种情况下,应该在客户主机上使用比如 “ mysqldump -T
” 的命令来生成文件。
默认情况下,如果遇到NULL值,将会返回 “\N”。
mysqldump工具不仅可以将数据导出为包含CREATE、INSERT的sql文件,也可以导出为纯文本文件。
mysqldump导出文本文件的基本语法格式如下:
mysqldump -T path -u username -p dbname [tables] [OPTIONS] --文件路径需要加双引号
--OPTIONS 选项 (value字符串不需要加引号)
--fields-terminated-by=value
--fields-enclosed-by=value
--fields-optionally-by=value
--fields-escaped-by=value
--lines-terminated-by=value
只有指定了 -T 参数才可以同时导出纯文本文件;
path表示导出数据的目录;
tables为指定要导出的表名称,如果不指定,将导出数据库中所有表;
[OPTIONS]为可选参数选项,这些选项需要结合 -T 选项使用。
使用OPTIONS常用的取值有:
MySQL提供了一些导入数据的工具,这些工具有LOAD DATA语句和source命令。LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表。
LOAD DATA语句的基本格式如下:
LOAD DATA INFILE 'filename.txt' INTO TABLE tablename [OPTIONS] [IGNORE number LINES]
--OPTIONS 选项
FIELDS TERMINATED BY 'value'
FIELDS [OPTIONALLY] ENCLOSED BY 'value'
FIELDS ESCAPED BY 'value'
LINES STARTING BY 'value'
LINES TERMINATED BY 'value'
IGNORE number LINES选项表示忽略文件开始处的行数,number表示忽略的行数。执行LOAD DATA语句需要FILE权限。
使用mysqlimport可以导入文本文件,并且不需要登录MySQL客户端。
mysqlimport命令的基本格式如下:
mysqlimport -u username -p dbname filename.txt [OPTIONS] --文件路径不用加引号
--OPTIONS 选项 (value字符串不需要加引号)
--fields-terminated-by=value
--fields-enclosed-by=value
--fields-optionally-by=value
--fields-escaped-by=value
--lines-terminated-by=value
--ignore-lines=n
注意:mysqlimport命令不指定导入数据库的表名称,数据表的名称由导入文件名称确定,即文件名作为表名,导入数据之前该表必须存在。若只指定文件名,则该文件只能存放在指定数据库文件夹里。
使用mysqldump和LOAD DATA语句时需要注意文件所在文件夹的读写权限,而mysqlimport则不需要。
如果在导出txt文件时指定了一些特殊分隔字符,则恢复语句也要指定这些字符,已确保恢复后数据的完整性和正确性。
备份时必须确保没有使用这些表。如果在复制一个表的同时服务器正在修改它,则复制无效。备份文件时,最好关闭服务器。然后重新启动服务器。为了保证数据的一致性,需要在备份文件前执行以下SQL语句:
FLUSH TABLES WITH READ LOCK;
也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证复制过程中不会有新的数据写入。
mysqldump如果只指定数据库的名称,则该语句只备份了数据库下所有的表。所以在恢复时,如果指定数据库不存在,则需要创建后再进行恢复。