大数据兼云计算(王明龙)讲师-MYSQL-DAY12-数据复制,备份,恢复

数据复制,备份,恢复

一.记录的,复制,导入,导出

1.复制记录

语法1
mysql> insert into 当前表 (字段1,字段2) select 要复制的字段名 from 要复制的表名;

语法2
mysql> insert into 当前表 (字段1,字段2)  select lower(要复制的字段名) ,password(lower(要被加密的字段)) from 要复制的表名;

举例:
CREATE TABLE `t1` (   `cs` char(30) DEFAULT NULL,   `id` int(11) DEFAULT NULL,   `name` varchar(255) DEFAULT NULL,   `xx` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET='utf8';

CREATE TABLE `t10` (   `cs` char(30) DEFAULT NULL,   `id` int(11) DEFAULT NULL,   `name` varchar(255) DEFAULT NULL,   `xx` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET='utf8';

insert into t10(id,name) select lower(id),password(lower(name)) from t1; 

解析:
lower 是不区分大小写函数
password 是加密函数

语法1举例:

复制单个字段记录
mysql> insert into lili values(1,'wang');
mysql> insert into lili values(2,'ming');
mysql> select * from lili;
+----+------+
| id | name|
+----+------+
| 1 | wang|
| 2 | ming |
+----+------+

mysql> create table toto(id int not null,name varchar(10));
mysql> insert into toto (id) select lower(id) from lili;
mysql> select * from toto;
+----+------+
| id | name |
+----+------+
| 1 | NULL |
| 2 | NULL |
+----+------+
2 rows in set (0.00 sec)

复制所有记录
mysql> select * from lili;
+----+------+
| id | name |
+----+------+
| 1 | wang |
| 2 | ming |
+----+------+

mysql> insert into toto select * from lili;
mysql> select * from toto;
+----+------+
| id | name |
+----+------+
| 1 | wang |
| 2 | ming |
+----+------+


语法2举例:
lower 是不区分大小写函数
password 是加密函数

创建表employee
 create table employee (id int,name char(10),agi int,sex enum('M','F'),department char(10));
 insert into employee values (23,'john',27,'M','Engi'),(31,'Sue',31,'F','Fiance'),(113,'David',26,'M','Admin');
 select * from employee;
+------+-------+------+------+------------+
| id  | name | agi | sex | department |
+------+-------+------+------+------------+
|  23 | john |  27 | M  | Engi    | 
|  31 | Sue  |  31 | F  | Fiance   | 
| 113 | David |  26 | M  | Admin   | 
+------+-------+------+------+------------+

创建表user
 create table user (uid int primary key auto_increment,uname char(10),upass char(10));

1.复制记录
 insert into user (uname,upass) select lower(name),password(lower(name)) from employee;
 select * from user;
+-----+-------+------------+
| uid | uname | upass   |
+-----+-------+------------+
|  1 | john | *DACDE7F57 | 
|  2 | sue  | *934B89788 | 
|  3 | david | *8201E0C1B | 
+-----+-------+------------+


2.复制记录时,可以添加where条件
insert into 表名 select * from 被复制表 where 字段=记录;

 insert into user (uname,upass) select (name),password(name) from employee where department='Fiance';
 select * from user;
+-----+-------+------------+
| uid | uname | upass   |
+-----+-------+------------+
|  1 | john | *DACDE7F57 | 
|  2 | sue  | *934B89788 | 
|  3 | david | *8201E0C1B | 
|  4 | Sue  | *287E48EAA | 
+-----+-------+------------+


3.导入记录数据
load data infile...
语法:
load data infile '文件绝对路径' into table 表名 fields terminated by '字段分割符' lines terminated by '记录分割符';

样例:
load data infile '/tmp/a.txt' into table t20 fields terminated by ':' lines terminated by '\n';

4.导出记录数据
select...into outfile...
语法:
select 字段 from 表名 into outfile '文件绝对路径' fields terminated by '字段分隔符' lines terminated by '记录分隔符'; 

样例:
select * from t20 into outfile '/tmp/b.txt' fields terminated by ':' lines terminated by '\n';

样例
# cd /
# vim a.txt
1,xiaoming
2,tom
3,jim
4,lili
......

导入
mysql> load data infile /a.txt into table 表名 fields terminated by ',' lines terminated by '\n';

导出
select * from 表名 into outfile '/tmp/b.txt' fields terminated by ',' lines terminated by '\n';
select * from 表名 into outfile '/tmp/b.txt' fields terminated by ',' enclose by lines terminated by '\n';


二.表的备份,恢复

1.复制
------------------------------------------------------------------------------------------
表复制
mysql> create table 新表(select * from 被复制表);

表结构复制
---------------------------------------------------------------------------
//5=3条件不成立则复制表结构
mysql> create table 新表(select * from 被复制表 where 5=3);

下面为相反

//1=1条件成立则复制表结构+数据
mysql> create table 新表(select * from 被复制表 where 1=1);
---------------------------------------------------------------------------

复制表中指定字段
mysql> create table 新表(select 字段 from 被复制表);


例
mysql> select * from t7;
+------+------+
| name | id  |
+------+------+
| aaa | NULL |
| 10  |  1 |
| 10  |  2 |
| 10  |  0 |
| 10  |  0 |
| 4  | 100 |
| NULL |  0 |
| NULL |  0 |
+------+------+
8 rows in set (0.00 sec)


上面是建好的t7的表,我只要复制id字段,

操作,tm是新建的表名
mysql> create table tm(select id from t7);
mysql> select * from tm;
+------+
| id  |
+------+
| NULL |
|  1 |
|  2 |
|  0 |
|  0 |
| 100 |
|  0 |
|  0 |
+------+
8 rows in set (0.00 sec)


create table 表名(字段 int,字段 char(10));


2.备份表
-------------------------------------------------------------------------------------
# mysqldump -u root -p密码 数据库名 表名 > /数据库.表.bak

样例
# mysqldump -u root -p db2 t7 > /db2.t7.bak



3.备份多表:                  就是把所有表备份成一个文件
-------------------------------------------------------------------------------------------
# mysqldump -u root -p密码 数据库名 表1 表2.. > /数据库.表.bak

样例
# mysqldump -u root -p db2 t7 t8 t9 > /db2.t7.t8.t9.bak



4.恢复表
---------------------------------------------------------------------------
# mysql -u root -p 密码 -D 数据库名 < /表文件  

  mysql -u root -p 密码 数据库名 < /表文件

  mysql> use 数据库名;
  mysql> source /表文件


样例
# mysql -u root -p密码         #进入数据库
mysql> use db2;             #进入db2数据库
mysql> drop table t7,t8,t9;     #删除t7,t8,t9的表 
mysql> exit

# mysql -u root -p密码 -D db2 < /db2.t7.t8.t9.bak 

  mysql -u root -p密码 db2 < /db2.t7.t8.t9.bak

# mysql -u root -p密码

mysql> use db2;
mysql> show tables;

+---------------+
| Tables_in_db2 |
+---------------+
| t7      |
| t8      |
| t9      |
+---------------+


一. 只导出结构
============================================================== 

1.导出整个数据库结构(不包含数据)
--------------------------------------------------
语法
------
mysqldump -h 远程主机ip -u 用户名 -p 密码 -d 数据库名 > 数据库名.sql

示例
------
mysqldump -h localhost -uroot -p123456 -d database table > dump.sql


2.导出单个数据表结构(不包含数据)
--------------------------------------------------
语法
------
mysqldump -h 远程主机ip -u用户名 -p密码 -d 数据库名 表名 > 数据库名.表名.sql

示例
------
mysqldump -h localhost -uroot -p123456 -d database table > dump.sql

==============================================================




二.只导出数据
==============================================================

1.导出整个数据库数据
------------------------------
语法
------
mysqldump -h 远程主机ip -u用户名 -p密码 -t 数据库名 > 数据库.sql

示例
------
mysqldump -h localhost -uroot -p123456 -t database > dump.sql

==============================================================


三.导出结构+数据
==============================================================

1.导出整个数据库结构和数据
---------------------------------------
mysqldump -h localhost -uroot -p123456 database > dump.sql


2.导出单个数据表结构和数据
---------------------------------------
mysqldump -h localhost -uroot -p123456 database table > dump.sql

==============================================================


三.数据库的备份,恢复

1.备份指定库
-----------------------------------------------------------------------------
# mysqldump -u root -p密码 -B 数据库名 > /数据库.sql
# mysqldump -u root -p密码 数据库名 > /数据库.sql

样例
# mysqldump -u root -p密码 -B db2 > /db2.sql
# mysqldump -u root -p密码 db2 > /db2.sql

2.恢复指定库
----------------------------------------------------------------------------------------------
# create database 数据库名;              #必须创建数据库名,如果有就覆盖
# mysql -u root -p密码 数据库名 < /数据库.bak
或
# mysql -u root -p密码 -B 数据库名 < /数据库.bak

样例
# mysql -u root -p密码
mysql> drop database db2;
mysql> exit


3.备份所有库
-----------------------------------------------------------------
# mysqldump -u root -p密码 -A > /数据库.bak

4.恢复所有库
------------------------------------------------------------
第1种方法
# mysql -u root -p密码 -A < /数据库.bak
或
# mysql -u root -p密码 < /数据库.bak


第2种方法
# mysql -u root -p密码 
mysql> source /数据库.bak
mysql> source 数据库.bak            #上面的如果报错,就把备份拷到当前的登陆目录下,在执行此条语句,不用就绝对路径


5.整个日志恢复
---------------------
mysqlbinlog mysql-bin.00001 | mysql -uroot -pmysql
mysqlbinlog mysql-bin.[0-10] | mysql -uroot -pmysql


特别注意: --single-transaction 参数
1.所有备份操作,都会进行隐式锁表,其默认参数为 --lock-all-tables , 备份完成后会自动unlock tables;
2.--single-transaction 参数备份时不锁表 , 与--lock-all-tables & --lock-tables相冲突,不能同时使用,所以调用以下参数会自动关闭这两个参数
3.--single-transaction 因为它不需要锁表 , 主要功能是保持数据的一致性 , 它调用了事物 , 因为事物有4个特性(原子性,一致性,隔离性,持久性) , 所以只对innodb有效

语法
mysqldump -uroot -pmysql 库名 --single-transaction > 库名.sql           //这里只是简单语法,上面的所有备份操作都可以加此参数



猜你喜欢

转载自blog.csdn.net/wangminglong1989/article/details/81562677