方法1、 Create table new_table_nam备份到新表:
MYSQL不支持: Select * Into new_table_name from old_table_name;
替代方法: create table tb2 select c1,c2,c3 from tb1 group by c1,c2,c3;html
方法2、insert into newtable select * from oldtable;mysql
1. 语法介绍
有三张表a、b、c,如今须要从表b和表c中分别查几个字段的值插入到表a中对应的字段。对于这种状况,可使用以下的语句来实现:sql
INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name数据库
上面的语句比较适合两个表的数据互插,若是多个表就不适应了。对于多个表,能够先将须要查询的字段JOIN起来,而后组成一个视图后再SELECT FROM就能够了:swift
INSERT INTO a (field1,field2) SELECT * FROM(SELECT b.f1,c.f2 FROM b JOIN c) AS tbwindows
其中f1是表b的字段,f2是表c的字段,经过JOIN查询就将分别来自表b和表c的字段进行了组合,而后再经过SELECT嵌套查询插入到表a中,这样就知足了这个场景了,若是须要不止2个表,那么能够多个JOIN的形式来组合字段。缓存
2. 语法错误注意
须要注意的是嵌套查询部分最后必定要有设置表别名,以下:安全
SELECT * FROM (SELECT f1,f2 FROM b JOIN c) AS tb服务器
即最后的AS tb是必须的(tb这个名称能够随意取),即指定一个别名。每一个派生出来的新表都必须指定别名,不然在mysql中会报以下错误:oracle
方法3、mysqldump批量导出表结构(数据)到sql:
1.先备份表结构和数据
仅导出结构,不导出数据:
一、导出數據库為dbname的表结构
mysqldump -h主机地址 -u用户名 -p密码 -d dbname >db.sql;
二、导出數據库為dbname某张表(test)结构
mysqldump -h主机地址 -u用户名 -p密码 -d dbname test>db.sql;
导出结构+数据:
三、导出數據库為dbname全部表结构及表數據(不加-d)
mysqldump -h主机地址 -u用户名 -p密码 dbname >db.sql;
四、导出數據库為dbname某张表(test)结构及表數據(不加-d)
mysqldump -h主机地址 -u用户名 -p密码 dbname test>db.sql;
5.导出数据中dbname多张表(test1,test2,test3)结构及表数据用用空格隔开
mysqldump -h主机地址 -u用户名 -p密码 dbname test1 test2 test3>db.sql;
方法4、在本地直接导出服务器数据:
mysql DB_name -h10.36.10.11 -utest -p -e "select * from TABLE_name where acti_type <> '无效'; order by acti_date desc" > ./test.txt
-N 便可 -N, --skip-column-names.Don't write column names in results.
方法5、 select into outfile导出到文件:
BACKUP TABLE 语法其实和 mysqlhotcopy 的工做原理差很少,都是锁表,而后拷贝数据文件。它能实如今线备份,可是效果不理想,所以不推荐使用。它只拷贝表结构文件和数据文件,不一样时拷贝索引文件,所以恢复时比较慢。
例子:
BACK TABLE tbl_name TO '/tmp/db_name/';
注意,必需要有 FILE 权限才能执行本SQL,而且目录 /tmp/db_name/ 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以免安全问题。
SELECT INTO OUTFILE 则是把数据导出来成为普通的文本文件,能够自定义字段间隔的方式,方便处理这些数据。
例子:
SELECT * INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
注意,必需要有 FILE 权限才能执行本SQL,而且文件 /tmp/db_name/tbl_name.txt 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以免安全问题。
恢复
用 BACKUP TABLE 方法备份出来的文件,能够运行 RESTORE TABLE 语句来恢复数据表。
例子:
RESTORE TABLE FROM '/tmp/db_name/';
权限要求相似上面所述。
用 SELECT INTO OUTFILE 方法备份出来的文件,能够运行 LOAD DATA INFILE 语句来恢复数据表。
例子:
LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
权限要求相似上面所述。倒入数据以前,数据表要已经存在才行。若是担忧数据会发生重复,能够增长 REPLACE 关键字来替换已有记录或者用 IGNORE 关键字来忽略他们。
使用into outfile 和 load data infile导入导出备份数据,这种方法的好处是,导出的数据能够本身规定格式,而且导出的是纯数据,不存在建表信息,你能够直接导入另一个同数据库的不一样表中,相对于mysqldump比较灵活机动。
咱们来看下面的例子:
(1)下面的mysql命令是把select的mytable表中的数据导出到/home/db_bak2012文件。
select * from mytable where status!=0 and name!='' into outfile '/home/db_bak2012'
fields terminated by '|' enclosed by '"' lines terminated by '\r\n' ;
导入刚才备份的数据,可使用load file方法,下面的mysql命令,把导出的数据导入了mytable_bak的表中:
load data infile '/home/db_bak2012' into table mytable_bak
fields terminated by '|' enclosed by '"' lines terminated by '\r\n' ;
select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id desc;
Recent Ubuntu Server Editions (such as 10.04) ship with AppArmor and MySQL's profile might be in enforcing mode by default. You can check this by executing sudo aa-status like so:
> sudo aa-status
5 profiles are loaded. 5 profiles are in enforce mode. /usr/lib/connman/scripts/dhclient-script /sbin/dhclient3 /usr/sbin/tcpdump /usr/lib/NetworkManager/nm-dhcp-client.action /usr/sbin/mysqld 0 profiles are in complain mode. 1 processes have profiles defined. 1 processes are in enforce mode : /usr/sbin/mysqld (1089) 0 processes are in complain mode.
If mysqld is included in enforce mode, then it is the one probably denying the write. Entries would also be written in /var/log/messages when AppArmor blocks the writes/accesses. What you can do is edit /etc/apparmor.d/usr.sbin.mysqld and add /data/ and /data/* near the bottom like so:
/usr/sbin/mysqld { ... /var/log/mysql/ r, /var/log/mysql/* rw, /var/run/mysqld/mysqld.pid w, /var/run/mysqld/mysqld.sock w, /data/ r, /data/* rw, }
And then make AppArmor reload the profiles.
> sudo /etc/init.d/apparmor reload
补充一点,A表数据 复制到B表,B表不能有自增ID
若是有自增ID,则不插入自增
insert into B (title) select title from A
方法6、 把bestlovesky.xls以文本方式打开,而后另存为,在编码选择ansi编码,保存
echo "select id,name from bestlovesky where 1 order by id desc limit 0, 50;"| /usr/local/mysql/bin/mysql -h127.0.0.1-uroot -p123456 > /data/bestlovesky.xls
默认带有字段名/列名,不输出列名使用-N参数。
由于office默认的是gb2312编码,服务器端生成的颇有多是utf-8编码,这个时候你有两种选择,1.在服务器端使用iconv来进行编码转换
格式为: LOAD DATA INFILE "/path/to/file" INTO TABLE table_name;
LOAD DATA [LOW_PRIORITY CONCURRENT] [LOCAL] INFILE ’file_name.txt’
[REPLACE IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY ’string’]
[[OPTIONALLY] ENCLOSED BY ’char’]
[ESCAPED BY ’char’ ]
]
[LINES
[STARTING BY ’string’]
[TERMINATED BY ’string’]
]
[IGNORE number LINES]
[(col_name_or_user_var,...)]
[SET col_name = eXPr,...)]
例如:
load data infile '/home/mysql/xxxxxxxxx.csv'
into table `table_name`
character set utf8
fields terminated by '^'
lines terminated by '\n';
注意:若是导出时用到了FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'语句,那么LODA时也要加上一样的分隔限制语句。还要注意编码问题。
fields和lines在前面,(col_name_or_user_var,…)在后面 若是你使用的时候直接把要写的这些属性放在表名后面,这样是不正确的,必定要写到fields和lines的后面,
方法2、Source 备份表的路径 如:Source d:/ok_db.sql便可导入sql文件。
经过source命令导入多个文件,能够新建一个sou.sql文件,里面存放下面的命令
例如:
source d:/a1.sql;
source d:/a2.sql;
当你运行
这样就能够在一个source命令里面导入多个sql文件了。
MySQL数据库备份和恢复方法详解
本文讨论 MySQL 的备份和恢复机制,以及如何维护数据表,包括最主要的两种表类型:MyISAM 和 Innodb,文中设计的 MySQL 版本为 5.0.22。
目前 MySQL 支持的免费备份工具备:mysqldump、mysqlhotcopy,还能够用 SQL 语法进行备份:BACKUP TABLE 或者 SELECT INTO OUTFILE,又或者备份二进制日志(binlog),还能够是直接拷贝数据文件和相关的配置文件。MyISAM 表是保存成文件的形式,所以相对比较容易备份,上面提到的几种方法均可以使用。Innodb 全部的表都保存在同一个数据文件 ibdata1 中(也多是多个文件,或者是独立的表空间文件),相对来讲比较很差备份,免费的方案能够是拷贝数据文件、备份 binlog,或者用 mysqldump。
一、mysqldump
1.1 备份
mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不一样的 MySQL 版本之间升级时相对比较合适,这也是最经常使用的备份方法。
如今来说一下 mysqldump 的一些主要参数:
–compatible=name它告诉 mysqldump,导出的数据将和哪一种数据库或哪一个旧版本的 MySQL 服务器相兼容。值能够为 ansi、mysql32三、mysql40、postgresql、oracle、mssql、db二、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将它们隔开。固然了,它并不保证能彻底兼容,而是尽可能兼容。
–complete-insert,-c导出的数据采用包含字段名的完整 INSERT 方式,也就是把全部的值都写在一行。这么作能提升插入效率,可是可能会受到 max_allowed_packet 参数的影响而致使插入失败。所以,须要谨慎使用该参数,至少我不推荐。
–default-character-set=charset指定导出数据时采用何种字符集,若是数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,不然再次导入数据后将产生乱码问题。
–disable-keys告诉 mysqldump 在 INSERT 语句的开头和结尾增长 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提升插入语句的速度,由于它是在插入完全部数据后才重建索引的。该选项只适合 MyISAM 表。
–extended-insert = true|false默认状况下,mysqldump 开启 --complete-insert 模式,所以不想用它的的话,就使用本选项,设定它的值为 false 便可。
–hex-blob使用十六进制格式导出二进制字符串字段。若是有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。
–lock-all-tables,-x在开始导出以前,提交请求锁定全部数据库中的全部表,以保证数据的一致性。这是一个全局读锁,而且自动关闭 --single-transaction 和 --lock-tables 选项。
–lock-tables它和 --lock-all-tables 相似,不过是锁定当前导出的数据表,而不是一会儿锁定所有库下的表。本选项只适用于 MyISAM 表,若是是 Innodb 表能够用 --single-transaction 选项。
–no-create-info,-t只导出数据,而不添加 CREATE TABLE 语句。
–no-data,-d不导出任何数据,只导出数据库表结构。
–opt这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,而且导出的数据能很快导回。该选项默认开启,但能够用 --skip-opt 禁用。注意,若是运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。若是导出大数据库的话可能会出现问题。
–quick,-q该选项在导出大表时颇有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得全部记录后将它们缓存到内存中。
–routines,-R导出存储过程以及自定义函数。
–single-transaction该选项在导出数据以前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和BDB。
本选项和 --lock-tables 选项是互斥的,由于 LOCK TABLES 会使任何挂起的事务隐含提交。
要想导出大表的话,应结合使用 --quick 选项。
–triggers同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。
其余参数详情请参考手册,我一般使用如下 SQL 来备份 MyISAM 表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --extended-insert=false
--triggers -R --hex-blob -x db_name > db_name.sql
使用如下 SQL 来备份 Innodb 表:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --extended-insert=false
--triggers -R --hex-blob --single-transaction db_name > db_name.sql
另外,若是想要实如今线备份,还可使用 --master-data 参数来实现,以下:
/usr/local/mysql/bin/mysqldump -uyejr -pyejr
--default-character-set=utf8 --opt --master-data=1
--single-transaction --flush-logs db_name > db_name.sql
它只是在一开始的瞬间请求锁表,而后就刷新binlog了,然后在导出的文件中加入CHANGE MASTER 语句来指定当前备份的binlog位置,若是要把这个文件恢复到slave里去,就能够采用这种方法来作。
注意:–extended-insert 须要根据实际状况决定是否启用或关闭 ,会对数据恢复速度产生较大影响。
1.2 还原
用 mysqldump 备份出来的文件是一个能够直接倒入的 SQL 脚本,有两种方法能够将数据导入。
直接用 mysql 客户端例如:
/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
用 SOURCE 语法其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如:
SOURCE /tmp/db_name.sql;
这里须要指定文件的绝对路径,而且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。
二、 mysqlhotcopy
2.1 备份
mysqlhotcopy 是一个 PERL 程序,最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件、数据文件、索引文件)所在的机器上。mysqlhotcopy 只能用于备份 MyISAM,而且只能运行在类Unix 和 NetWare 系统上。
mysqlhotcopy 支持一次性拷贝多个数据库,同时还支持正则表达。如下是几个例子:
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name /tmp (把数据库目录 db_name 拷贝到 /tmp 下)
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr
db_name./regex/ /tmp
更详细的使用方法请查看手册,或者调用下面的命令来查看 mysqlhotcopy 的帮助:
perldoc /usr/local/mysql/bin/mysqlhotcopy
注意,想要使用 mysqlhotcopy,必需要有 SELECT、RELOAD(要执行 FLUSH TABLES) 权限,而且还必需要可以有读取 datadir/db_name目录的权限。
2.2 还原
mysqlhotcopy 备份出来的是整个数据库目录,使用时能够直接拷贝到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)目录下便可,同时要注意权限的问题,以下例:
root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改为
mysqld
运行用户)
四、 启用二进制日志(binlog)
采用 binlog 的方法相对来讲更灵活,省心省力,并且还能够支持增量备份。
启用 binlog 时必需要重启 mysqld。首先,关闭 mysqld,打开 my.cnf,加入如下几行:
server-id = 1
log-bin = binlog
log-bin-index = binlog.index
而后启动 mysqld 就能够了。运行过程当中会产生 binlog.000001 以及 binlog.index,前面的文件是 mysqld 记录全部对数据的更新操做,后面的文件则是全部binlog 的索引,都不能轻易删除。关于 binlog 的信息请查看手册。
须要备份时,能够先执行一下 SQL 语句,让 mysqld 终止对当前 binlog 的写入,就能够把文件直接备份,这样的话就能达到增量备份的目的了:
FLUSH LOGS;
若是是备份复制系统中的从服务器,还应该备份 master.info 和 relay-log.info 文件。
备份出来的 binlog 文件能够用 MySQL 提供的工具 mysqlbinlog 来查看,如:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
该工具容许你显示指定的数据库下的全部 SQL 语句,而且还能够限定时间范围,至关的方便,详细的请查看手册。
恢复时,能够采用相似如下语句来作到:
/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
把 mysqlbinlog 输出的 SQL 语句直接做为输入来执行它。
若是你有空闲的机器,不妨采用这种方式来备份。因为做为 slave 的机器性能要求相对不是那么高,所以成本低,用低成本就能实现增量备份并且还能分担一部分数据查询压力,何乐而不为呢?
五、 直接备份数据文件
相较前几种方法,备份数据文件最为直接、快速、方便,缺点是基本上不能实现增量备份。为了保证数据的一致性,须要在靠背文件前,执行如下 SQL 语句:
FLUSH TABLES WITH READ LOCK;
也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程当中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下便可。
注意,对于 Innodb 类型表来讲,还须要备份其日志文件,即 ib_logfile* 文件。由于当 Innodb 表损坏时,就能够依靠这些日志文件来恢复。
六、 备份策略
对于中等级别业务量的系统来讲,备份策略能够这么定:第一次全量备份,天天一次增量备份,每周再作一次全量备份,如此一直重复。而对于重要的且繁忙的系统来讲,则可能须要天天一次全量备份,每小时一次增量备份,甚至更频繁。为了避免影响线上业务,实如今线备份,而且能增量备份,最好的办法就是采用主从复制机制(replication),在 slave 机器上作备份。
七、 数据维护和灾难恢复
做为一名DBA(我目前还不是,呵呵),最重要的工做内容之一是保证数据表能安全、稳定、高速使用。所以,须要按期维护你的数据表。如下 SQL 语句就颇有用:
CHECK TABLE 或 REPAIR TABLE,检查或维护 MyISAM 表
OPTIMIZE TABLE,优化 MyISAM 表
ANALYZE TABLE,分析 MyISAM 表
固然了,上面这些命令起始均可以经过工具 myisamchk 来完成,在这里不做详述。
Innodb 表则能够经过执行如下语句来整理碎片,提升索引速度:
ALTER TABLE tbl_name ENGINE = Innodb;
这实际上是一个 NULL 操做,表面上看什么也不作,实际上从新整理碎片了。
一般使用的 MyISAM 表能够用上面提到的恢复方法来完成。若是是索引坏了,能够用 myisamchk 工具来重建索引。而对于 Innodb表来讲,就没这么直接了,由于它把全部的表都保存在一个表空间了。不过 Innodb 有一个检查机制叫 模糊检查点,只要保存了日志文件,就能根据日志文件来修复错误。能够在 my.cnf 文件中,增长如下参数,让 mysqld 在启动时自动检查日志文件:
innodb_force_recovery = 4
关于该参数的信息请查看手册。
附:mysqldump详解:
使用mysqldump导出固定条件的数据库
咱们来看几个经常使用用例:
(1)导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql
(2)导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql
(3)导出一个数据库结构
mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
#-d 不导出数据只导出结构 --add-drop-table 在每一个create语句以前增长一个drop table
(4)导入数据库,经常使用source 命令
#进入mysql数据库控制台,
mysql -u root -p
mysql>use 数据库
mysql>set names utf8; (先确认编码,若是不设置可能会出现乱码,注意不是UTF-8)
#而后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:\wcnc_db.sql
上边的实例只是最基础的,有的时候咱们可能须要批量导出多个库,咱们就能够加上--databases 或者-B,以下语句:
mysqldump -uroot -p --databases test mysql #空格分隔
还有的时候咱们可能须要把数据库内全部的库所有备份,咱们就可使用-all-databases,以下语句:
mysqldump -uroot -p -all-databases
可能咱们还会有更多的需求,下面是我在网上找的感受比较全的参数说明,贴出来供你们参考。
参数说明
--all-databases , -A
导出所有数据库。
mysqldump -uroot -p --all-databases
--all-tablespaces , -Y
导出所有表空间。
mysqldump -uroot -p --all-databases --all-tablespaces
--no-tablespaces , -y
不导出任何表空间信息。
mysqldump -uroot -p --all-databases --no-tablespaces
--add-drop-database
每一个数据库建立以前添加drop数据库语句。
mysqldump -uroot -p --all-databases --add-drop-database
--add-drop-table
每一个数据表建立以前添加drop数据表语句。(默认为打开状态,使用--skip-add-drop-table取消选项)
mysqldump -uroot -p --all-databases (默认添加drop语句)
mysqldump -uroot -p --all-databases –skip-add-drop-table (取消drop语句)
--add-locks
在每一个表导出以前增长LOCK TABLES而且以后UNLOCK TABLE。(默认为打开状态,使用--skip-add-locks取消选项)
mysqldump -uroot -p --all-databases (默认添加LOCK语句)
mysqldump -uroot -p --all-databases –skip-add-locks (取消LOCK语句)
--allow-keywords
容许建立是关键词的列名字。这由表名前缀于每一个列名作到。
mysqldump -uroot -p --all-databases --allow-keywords
--apply-slave-statements
在'CHANGE MASTER'前添加'STOP SLAVE',而且在导出的最后添加'START SLAVE'。
mysqldump -uroot -p --all-databases --apply-slave-statements
--character-sets-dir
字符集文件的目录
mysqldump -uroot -p --all-databases --character-sets-dir=/usr/local/mysql/share/mysql/charsets
--comments
附加注释信息。默认为打开,能够用--skip-comments取消
mysqldump -uroot -p --all-databases (默认记录注释)
mysqldump -uroot -p --all-databases --skip-comments (取消注释)
--compatible
导出的数据将和其它数据库或旧版本的MySQL 相兼容。值能够为ansi、mysql32三、mysql40、postgresql、oracle、mssql、db二、maxdb、no_key_options、no_tables_options、no_field_options等,
要使用几个值,用逗号将它们隔开。它并不保证能彻底兼容,而是尽可能兼容。
mysqldump -uroot -p --all-databases --compatible=ansi
--compact
导出更少的输出信息(用于调试)。去掉注释和头尾等结构。可使用选项:--skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys
mysqldump -uroot -p --all-databases --compact
--complete-insert, -c
使用完整的insert语句(包含列名称)。这么作能提升插入效率,可是可能会受到max_allowed_packet参数的影响而致使插入失败。
mysqldump -uroot -p --all-databases --complete-insert
--compress, -C
在客户端和服务器之间启用压缩传递全部信息
mysqldump -uroot -p --all-databases --compress
--create-options, -a
在CREATE TABLE语句中包括全部MySQL特性选项。(默认为打开状态)
mysqldump -uroot -p --all-databases
--databases, -B
导出几个数据库。参数后面全部名字参量都被看做数据库名。
mysqldump -uroot -p --databases test mysql
--debug
输出debug信息,用于调试。默认值为:d:t:o,/tmp/mysqldump.trace
mysqldump -uroot -p --all-databases --debug
mysqldump -uroot -p --all-databases --debug=” d:t:o,/tmp/debug.trace”
--debug-check
检查内存和打开文件使用说明并退出。
mysqldump -uroot -p --all-databases --debug-check
--debug-info
输出调试信息并退出
mysqldump -uroot -p --all-databases --debug-info
--default-character-set
设置默认字符集,默认值为utf8
mysqldump -uroot -p --all-databases --default-character-set=latin1
--delayed-insert
采用延时插入方式(INSERT DELAYED)导出数据
mysqldump -uroot -p --all-databases --delayed-insert
--delete-master-logs
master备份后删除日志. 这个参数将自动激活--master-data。
mysqldump -uroot -p --all-databases --delete-master-logs
--disable-keys
对于每一个表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;语句引用INSERT语句。这样能够更快地导入dump出来的文件,由于它是在插入全部行后建立索引的。该选项只适合MyISAM表,默认为打开状态。
mysqldump -uroot -p --all-databases
--dump-slave
该选项将致使主的binlog位置和文件名追加到导出数据的文件中。设置为1时,将会以CHANGE MASTER命令输出到数据文件;设置为2时,在命令前增长说明信息。该选项将会打开--lock-all-tables,除非--single-transaction被指定。该选项会自动关闭--lock-tables选项。默认值为0。
mysqldump -uroot -p --all-databases --dump-slave=1
mysqldump -uroot -p --all-databases --dump-slave=2
--events, -E
导出事件。
mysqldump -uroot -p --all-databases --events
--extended-insert, -e
使用具备多个VALUES列的INSERT语法。这样使导出文件更小,并加速导入时的速度。默认为打开状态,使用--skip-extended-insert取消选项。
mysqldump -uroot -p --all-databases
mysqldump -uroot -p --all-databases--skip-extended-insert (取消选项)
--fields-terminated-by
导出文件中忽略给定字段。与--tab选项一块儿使用,不能用于--databases和--all-databases选项
mysqldump -uroot -p test test --tab=”/home/mysql” --fields-terminated-by=”#”
--fields-enclosed-by
输出文件中的各个字段用给定字符包裹。与--tab选项一块儿使用,不能用于--databases和--all-databases选项
mysqldump -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=”#”
--fields-optionally-enclosed-by
输出文件中的各个字段用给定字符选择性包裹。与--tab选项一块儿使用,不能用于--databases和--all-databases选项
mysqldump -uroot -p test test --tab=”/home/mysql” --fields-enclosed-by=”#” --fields-optionally-enclosed-by =”#”
--fields-escaped-by
输出文件中的各个字段忽略给定字符。与--tab选项一块儿使用,不能用于--databases和--all-databases选项
mysqldump -uroot -p mysql user --tab=”/home/mysql” --fields-escaped-by=”#”
--flush-logs
开始导出以前刷新日志。
请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。除使用--lock-all-tables或者--master-data外。在这种状况下,日志将会被刷新一次,相应的因此表同时被锁定。所以,若是打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。
mysqldump -uroot -p --all-databases --flush-logs
--flush-privileges
在导出mysql数据库以后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任什么时候候。
mysqldump -uroot -p --all-databases --flush-privileges
--force
在导出过程当中忽略出现的SQL错误。
mysqldump -uroot -p --all-databases --force
--help
显示帮助信息并退出。
mysqldump --help
--hex-blob
使用十六进制格式导出二进制字符串字段。若是有二进制数据就必须使用该选项。影响到的字段类型有BINARY、VARBINARY、BLOB。
mysqldump -uroot -p --all-databases --hex-blob
--host, -h
须要导出的主机信息
mysqldump -uroot -p --host=localhost --all-databases
--ignore-table
不导出指定表。指定忽略多个表时,须要重复屡次,每次一个表。每一个表必须同时指定数据库和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 ……
mysqldump -uroot -p --host=localhost --all-databases --ignore-table=mysql.user
--include-master-host-port
在--dump-slave产生的'CHANGE MASTER TO..'语句中增长'MASTER_HOST=<host>,MASTER_PORT=<port>'
mysqldump -uroot -p --host=localhost --all-databases --include-master-host-port
--insert-ignore
在插入行时使用INSERT IGNORE语句.
mysqldump -uroot -p --host=localhost --all-databases --insert-ignore
--lines-terminated-by
输出文件的每行用给定字符串划分。与--tab选项一块儿使用,不能用于--databases和--all-databases选项。
mysqldump -uroot -p --host=localhost test test --tab=”/tmp/mysql” --lines-terminated-by=”##”
--lock-all-tables, -x
提交请求锁定全部数据库中的全部表,以保证数据的一致性。这是一个全局读锁,而且自动关闭--single-transaction 和--lock-tables 选项。
mysqldump -uroot -p --host=localhost --all-databases --lock-all-tables
--lock-tables, -l
开始导出前,锁定全部表。用READ LOCAL锁定表以容许MyISAM表并行插入。对于支持事务的表例如InnoDB和BDB,--single-transaction是一个更好的选择,由于它根本不须要锁定表。
请注意当导出多个数据库时,--lock-tables分别为每一个数据库锁定表。所以,该选项不能保证导出文件中的表在数据库之间的逻辑一致性。不一样数据库表的导出状态能够彻底不一样。
mysqldump -uroot -p --host=localhost --all-databases --lock-tables
--log-error
附加警告和错误信息到给定文件
mysqldump -uroot -p --host=localhost --all-databases --log-error=/tmp/mysqldump_error_log.err
--master-data
该选项将binlog的位置和文件名追加到输出文件中。若是为1,将会输出CHANGE MASTER 命令;若是为2,输出的CHANGE MASTER命令前添加注释信息。该选项将打开--lock-all-tables 选项,除非--single-transaction也被指定(在这种状况下,全局读锁在开始导出时得到很短的时间;其余内容参考下面的--single-transaction选项)。该选项自动关闭--lock-tables选项。
mysqldump -uroot -p --host=localhost --all-databases --master-data=1;
mysqldump -uroot -p --host=localhost --all-databases --master-data=2;
--max_allowed_packet
服务器发送和接受的最大包长度。
mysqldump -uroot -p --host=localhost --all-databases --max_allowed_packet=10240
--net_buffer_length
TCP/IP和socket链接的缓存大小。
mysqldump -uroot -p --host=localhost --all-databases --net_buffer_length=1024
--no-autocommit
使用autocommit/commit 语句包裹表。
mysqldump -uroot -p --host=localhost --all-databases --no-autocommit
--no-create-db, -n
只导出数据,而不添加CREATE DATABASE 语句。
mysqldump -uroot -p --host=localhost --all-databases --no-create-db
--no-create-info, -t
只导出数据,而不添加CREATE TABLE 语句。
mysqldump -uroot -p --host=localhost --all-databases --no-create-info
--no-data, -d
不导出任何数据,只导出数据库表结构。
mysqldump -uroot -p --host=localhost --all-databases --no-data
--no-set-names, -N
等同于--skip-set-charset
mysqldump -uroot -p --host=localhost --all-databases --no-set-names
--opt
等同于--add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, --disable-keys 该选项默认开启, 能够用--skip-opt禁用.
mysqldump -uroot -p --host=localhost --all-databases --opt
--order-by-primary
若是存在主键,或者第一个惟一键,对每一个表的记录进行排序。在导出MyISAM表到InnoDB表时有效,但会使得导出工做花费很长时间。
mysqldump -uroot -p --host=localhost --all-databases --order-by-primary
--password, -p
链接数据库密码
--pipe(windows系统可用)
使用命名管道链接mysql
mysqldump -uroot -p --host=localhost --all-databases --pipe
--port, -P
链接数据库端口号
--protocol
使用的链接协议,包括:tcp, socket, pipe, memory.
mysqldump -uroot -p --host=localhost --all-databases --protocol=tcp
--quick, -q
不缓冲查询,直接导出到标准输出。默认为打开状态,使用--skip-quick取消该选项。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-quick
--quote-names,-Q
使用(`)引发表和列名。默认为打开状态,使用--skip-quote-names取消该选项。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-quote-names
--replace
使用REPLACE INTO 取代INSERT INTO.
mysqldump -uroot -p --host=localhost --all-databases --replace
--result-file, -r
直接输出到指定文件中。该选项应该用在使用回车换行对(\\r\\n)换行的系统上(例如:DOS,Windows)。该选项确保只有一行被使用。
mysqldump -uroot -p --host=localhost --all-databases --result-file=/tmp/mysqldump_result_file.txt
--routines, -R
导出存储过程以及自定义函数。
mysqldump -uroot -p --host=localhost --all-databases --routines
--set-charset
添加'SET NAMES default_character_set'到输出文件。默认为打开状态,使用--skip-set-charset关闭选项。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-set-charset
--single-transaction
该选项在导出数据以前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和--lock-tables 选项是互斥的,由于LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用--quick 选项。
mysqldump -uroot -p --host=localhost --all-databases --single-transaction
--dump-date
将导出时间添加到输出文件中。默认为打开状态,使用--skip-dump-date关闭选项。
mysqldump -uroot -p --host=localhost --all-databases
mysqldump -uroot -p --host=localhost --all-databases --skip-dump-date
--skip-opt
禁用–opt选项.
mysqldump -uroot -p --host=localhost --all-databases --skip-opt
--socket,-S
指定链接mysql的socket文件位置,默认路径/tmp/mysql.sock
mysqldump -uroot -p --host=localhost --all-databases --socket=/tmp/mysqld.sock
--tab,-T
为每一个表在给定路径建立tab分割的文本文件。注意:仅仅用于mysqldump和mysqld服务器运行在相同机器上。
mysqldump -uroot -p --host=localhost test test --tab="/home/mysql"
--tables
覆盖--databases (-B)参数,指定须要导出的表名。
mysqldump -uroot -p --host=localhost --databases test --tables test
--triggers
导出触发器。该选项默认启用,用--skip-triggers禁用它。
mysqldump -uroot -p --host=localhost --all-databases --triggers
--tz-utc
在导出顶部设置时区TIME_ZONE='+00:00' ,以保证在不一样时区导出的TIMESTAMP 数据或者数据被移动其余时区时的正确性。
mysqldump -uroot -p --host=localhost --all-databases --tz-utc
--user, -u
指定链接的用户名。
--verbose, --v
输出多种平台信息。
--version, -V
输出mysqldump版本信息并退出
--where, -w
只转储给定的WHERE条件选择的记录。请注意若是条件包含命令解释符专用空格或字符,必定要将条件引用起来。
mysqldump -uroot -p --host=localhost --all-databases --where=” user=’root’”
--xml, -X
导出XML格式.
mysqldump -uroot -p --host=localhost --all-databases --xml
--plugin_dir
客户端插件的目录,用于兼容不一样的插件版本。
mysqldump -uroot -p --host=localhost --all-databases --plugin_dir=”/usr/local/lib/plugin”
--default_auth
客户端插件默认使用权限。
mysqldump -uroot -p --host=localhost --all-databases --default-auth=”/usr/local/lib/plugin/<PLUGIN>”
http://see.xidian.edu.cn/cpp/html/1458.html
mysqldump命令用来备份数据库。
mysqldump命令在DOS的[url=file://\\mysql\\bin]\\mysql\\bin[/url]目录下执行。
1) 导出整个数据库(导出文件默认是存在mysql\bin目录下)
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql
2) 导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
3) 导出一个数据库结构
mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql
-d 没有数据 –add-drop-table 在每一个create语句以前增长一个drop table
4) 带语言参数导出
mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt database_name > outfile_name.sql
例如,将aaa库备份到文件back_aaa中:
[root@test1 root]# cd /home/data/mysql
[root@test1 mysql]# mysqldump -u root -p --opt aaa > back_aaa
1、mysqldump基本例子:
一、备份命令mysqldump格式
格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql
二、备份MySQL数据库为带删除表的格式
备份MySQL数据库为带删除表的格式,可以让该备份覆盖已有数据库而不须要手动删除原有数据库。
mysqldump --add-drop-table -uusername -ppassword -database databasename > backupfile.sql
三、直接将MySQL数据库压缩备份
mysqldump -hhostname -uusername -ppassword -database databasename | gzip > backupfile.sql.gz
四、备份MySQL数据库某个(些)表
mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
五、同时备份多个MySQL数据库
mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql仅仅备六、仅备份份数据库结构
mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
七、备份服务器上全部数据库
mysqldump –all-databases > allbackupfile.sql
八、还原MySQL数据库的命令
mysql -hhostname -uusername -ppassword databasename < backupfile.sql
九、还原压缩的MySQL数据库
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
十、将数据库转移到新服务器
mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename
十一、--master-data 和--single-transaction
在mysqldump中使用--master-data=2,会记录binlog文件和position的信息 。--single-transaction会将隔离级别设置成repeatable-commited
十二、导入数据库
经常使用source命令,用use进入到某个数据库,mysql>source d:\test.sql,后面的参数为脚本文件。
1三、查看binlog日志
查看binlog日志可用用命令 mysqlbinlog binlog日志名称|more
1四、general_log
General_log记录数据库的任何操做,查看general_log 的状态和位置能够用命令show variables like "general_log%" ,开启general_log能够用命令set global general_log=on
mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql
备份MySQL数据库为带删除表的格式
备份MySQL数据库为带删除表的格式,可以让该备份覆盖已有数据库而不须要手动删除原有数据库。
mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql
直接将MySQL数据库压缩备份
mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz
备份MySQL数据库某个(些)表
mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
同时备份多个MySQL数据库
mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql
仅仅备份数据库结构
mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
备份服务器上全部数据库
mysqldump –all-databases > allbackupfile.sql
还原MySQL数据库的命令
mysql -hhostname -uusername -ppassword databasename < backupfile.sql
还原压缩的MySQL数据库
gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
将数据库转移到新服务器
mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename
2、增量备份
小量的数据库能够天天进行完整备份,由于这也用不了多少时间,但当数据库很大时,就不太可能天天进行一次完整备份了,这时候就可使用增量备份。增量备份的原理就是使用了mysql的binlog志。
一、首先作一次完整备份:
mysqldump -h10.6.208.183 -utest2 -p123 -P3310 --single-transaction --master-data=2 test>test.sql这时候就会获得一个全备文件test.sql
在sql文件中咱们会看到:
-- CHANGE MASTER TO MASTER_LOG_FILE='bin-log.000002', MASTER_LOG_POS=107;是指备份后全部的更改将会保存到bin-log.000002二进制文件中。
二、在test库的t_student表中增长两条记录,而后执行flush logs命令。这时将会产生一个新的二进制日志文件bin-log.000003,bin-log.000002则保存了全备事后的全部更改,既增长记录的操做也保存在了bin-log.00002中。
三、再在test库中的a表中增长两条记录,而后误删除t_student表和a表。a中增长记录的操做和删除表a和t_student的操做都记录在bin-log.000003中。
3、恢复一、首先导入全备数据mysql -h10.6.208.183 -utest2 -p123 -P3310 < test.sql,也能够直接在mysql命令行下面用source导入二、恢复bin-log.000002 mysqlbinlog bin-log.000002 |mysql -h10.6.208.183 -utest2 -p123 -P3310 三、恢复部分 bin-log.000003 在general_log中找到误删除的时间点,而后更加对应的时间点到bin-log.000003中找到相应的position点,须要恢复到误删除的前面一个position点。能够用以下参数来控制binlog的区间--start-position 开始点 --stop-position 结束点--start-date 开始时间 --stop-date 结束时间找到恢复点后,既能够开始恢复。 mysqlbinlog mysql-bin.000003 --stop-position=208 |mysql -h10.6.208.183 -utest2 -p123 -P3310