mysql备份表结构和数据
方法一、 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;
方法二、insert into newtable select * from oldtable;
1. 语法介绍
有三张表a、b、c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段。对于这种情况,可以使用如下的语句来实现:
INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name
上面的语句比较适合两个表的数据互插,如果多个表就不适应了。对于多个表,可以先将需要查询的字段JOIN起来,然后组成一个视图后再SELECT FROM就可以了:
INSERT INTO a (field1,field2) SELECT * FROM(SELECT b.f1,c.f2 FROM b JOIN c) AS tb
其中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中会报如下错误:
方法三、mysqldump批量导出表结构(数据)到sql:
1.先备份表结构和数据
仅导出结构,不导出数据:
1、导出數據库為dbname的表结构
mysqldump -h主机地址 -u用户名 -p密码 -d dbname >db.sql;
2、导出數據库為dbname某张表(test)结构
mysqldump -h主机地址 -u用户名 -p密码 -d dbname test>db.sql;
导出结构+数据:
3、导出數據库為dbname所有表结构及表數據(不加-d)
mysqldump -h主机地址 -u用户名 -p密码 dbname >db.sql;
4、导出數據库為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;
方法四、在本地直接导出服务器数据:
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.
方法五、 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;
- 由MySQL服务器直接创建输出文件,这样的文件名应指定您希望在服务器主机上的文件将被写入。没有本地版本的LOAD DATA LOCAL版本的类似的语句。
- 必须要有MySQL的FILE权限才能执行的SELECT... INTO语句。
- 输出文件必须不存在。这可以防止MySQL从会破坏文件可能重要。
- 应该在服务器主机上或一些方法来检索文件从该主机的登录帐户。否则SELECT... INTO OUTFILE可能是没有价值的。
- 在Unix下,创造了世界可读的文件和所拥有的MySQL服务器。这意味着虽然就可以读取该文件,但是不能够删除它。
- 如何下载ie浏览器
- Spotify 尝试要求用户记录
- 【反向话题】【危险! ! !惩罚
- 【反向话题】【危险! ! !惩罚
- 为什么word文档打不开?文件说
- Ulifeng发布新款超耐用手机
- 如何在Foxit PDF Ed
- UltraEdit中如何设置Ta
- 如何设置华为手机助手连接设备后自
- Ubuntu16.04手动安装M
- MongoDB凭什么跻身数据库排
- 如何在Linux中建立快捷方式文
- 删除Linux软链接:分步指南(
- vs2010快速打开文件_vs2
- esp32 tf卡读取电路(es
- stm32f407外部晶振范围(
- win7打开QQ飞车没有音乐和音
- 【3D建模】基于MATLAB的三
- 【3D点云过滤】3D点云空间数据
- 最近写3D家居软件的过程
- 如何替换vs2010中的文本_V
- 如何使用红叶清单计价软件调整安全
- 如何在福昕阅读器中复制文本-如何
- CSS如何实现各种形状
- 介绍将 CSS 引入 HTML
- css中如何设置边框
- AMD发布RX 7800 XT和
- 美国政府限制英伟达和AMD向部分
- 网易Q2财报:净利润240亿元,
- 用vs2010创建控制台项目_如
Copyright© 黑海资讯