数据复制,备份,恢复
一.记录的,复制,导入,导出
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');
| 1 | wang|
mysql> create table toto(id int not null,name varchar(10));
mysql> insert into toto (id) select lower(id) from lili;
| 1 | NULL |
2 rows in set (0.00 sec)
复制所有记录
| 1 | wang |
mysql> insert into toto select * from lili;
| 1 | wang |
语法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');
| 23 | john | 27 | M | Engi |
| 31 | Sue | 31 | F | Fiance |
创建表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;
| 1 | john | *DACDE7F57 |
| 2 | sue | *934B89788 |
2.复制记录时,可以添加where条件
insert into 表名 select * from 被复制表 where 字段=记录;
insert into user (uname,upass) select (name),password(name) from employee where department='Fiance';
| 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 被复制表);
mysql> create table 新表(select * from 被复制表 where 5=3);
下面为相反
复制表中指定字段
mysql> create table 新表(select 字段 from 被复制表);
例
| aaa | NULL |
| 10 | 1 |
| 10 | 2 |
| 10 | 0 |
| 10 | 0 |
| 4 | 100 |
| NULL | 0 |
8 rows in set (0.00 sec)
上面是建好的t7的表,我只要复制id字段,
操作,tm是新建的表名
mysql> create table tm(select id from t7);
| NULL |
| 1 |
| 2 |
| 0 |
| 0 |
| 100 |
| 0 |
8 rows in set (0.00 sec)
create table 表名(字段 int,字段 char(10));
# mysqldump -u root -p密码 数据库名 表名 > /数据库.表.bak
样例
# mysqldump -u root -p db2 t7 > /db2.t7.bak
# mysqldump -u root -p密码 数据库名 表1 表2.. > /数据库.表.bak
样例
# mysqldump -u root -p db2 t7 t8 t9 > /db2.t7.t8.t9.bak
# 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;
+---------------+
| t7 |
| t8 |
一. 只导出结构
==============================================================
mysqldump -h 远程主机ip -u 用户名 -p 密码 -d 数据库名 > 数据库名.sql
mysqldump -h localhost -uroot -p123456 -d database table > dump.sql
mysqldump -h 远程主机ip -u用户名 -p密码 -d 数据库名 表名 > 数据库名.表名.sql
mysqldump -h localhost -uroot -p123456 -d database table > dump.sql
==============================================================
二.只导出数据
==============================================================
mysqldump -h 远程主机ip -u用户名 -p密码 -t 数据库名 > 数据库.sql
mysqldump -h localhost -uroot -p123456 -t database > dump.sql
==============================================================
三.导出结构+数据
==============================================================
mysqldump -h localhost -uroot -p123456 database > dump.sql
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 //这里只是简单语法,上面的所有备份操作都可以加此参数