show databases;
show tables;
create database DatabaseName;
drop database test01;
use DatabaseName;
select database();
show table status;
CREATE TABLE table_name (column_name column_type);
select *from tb1;
describe tb1;
delete from studentstable;
alter table 表名 add 列名 类型
alter table 表名 drop column 列名
alter table 表名 modify column 列名 类型;
alter table 表名 add primary key(列名);
alter table 表名 drop primary key;
在定义完列之后直接使用 UNIQUE 关键字指定唯一约束,语法规则如下:
<字段名> <数据类型> UNIQUE
在修改表时添加唯一约束的语法格式为:
ALTER TABLE <数据表名> ADD CONSTRAINT <唯一约束名> UNIQUE(<列名>);
//修改自增属性的列,必须具备主键的属性。
alter table 表名 modify column id int AUTO_INCREMENT;
向从表对一个字段增加外键属性时,从表中的这个字段必须已经存在,且不能有数据。
alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(从表的列名) references 主表(主键列名);
alter table 表名 drop foreign key 外键名称
注意
从表的的外键列的属性必须主表的主键列名属性一致。
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
修改数据库字符集:
ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];
把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...]
例如:
ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
查看数据库字符集:
SHOW CREATE DATABASE db_name;
查看表字符集:
SHOW CREATE TABLE tbl_name;
MySQL 5.7中
ENGINE = INNODB
是数据库默认的
my.cnf
中指定数据库服务器默认存储引擎default-storage-engine=InnoDB
CREATE TABLE t3 (i INT) ENGINE = MEMORY
ALTER TABLE t ENGINE = InnoDB;
insert into 表 (列名,列名...) values (值,值,值...)
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
update 表名 set 字段名1=值表达式1,字段名2=值表达式2,....[where条件] [order排序] [limit限定];
insert
语法#新建数据库
create database School;
#选择数据库
use School;
#新建表
create table calss(
id int not null auto_increment,
name varchar(10),
primary key (id)
);
create table teacher(
id int not null auto_increment,
name varchar(10),
age int default 0,
phone char(11) default '照片',
primary key (id)
);
create table student(
id int auto_increment primary key ,
name varchar(10),
age int,
class_id int,
foreign key (class_id)references calss(id)
);
create table class2teacher(
id int auto_increment primary key ,
class_id int,
teacher_id int,
foreign key (class_id) references calss(id),
foreign key (teacher_id)references teacher(id)
);
#插入数据
insert into calss(name)values
('云计算1810'),
('云计算1901'),
('云计算1902');
insert into teacher(name, age, phone) values
('奇哥', 18, '13733878989'),
('强哥', 28, '15633878989'),
('磊哥', 30, '13933878989'),
('闫老师', 18, '13633878989');
insert into student(name, age, class_id) values
('黛玉', 18, 3),
('钦文', 19, 3),
('马邦德', 30, 1),
('九筒', 48, 1),
('六子', 36, 2),
('汤师爷', 18, 2),
('麻匪', 18,2),
('黛玉', 18,2);
insert into class2teacher(class_id,teacher_id) values
(1,1),(1,2),(2,1),(2,2),(2,3),(3,1),(3,3);
select * from 表;
select * from 表 where 查询条件;
select 字段名 as 查询别名 from 表 where 查询条件;
select * from student where id > 1 and name != '王麻子' and age = 18;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmmqawJm-1582008065210)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215144156268.png)]
select * from student where id between 5 and 16;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0CrWNNOY-1582008065211)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215144612908.png)]
select * from student where id in (1,3,5);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6FpEktPG-1582008065211)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215144817919.png)]
select * from student where not id in (1,3,5);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TPHq4jcP-1582008065212)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215145008450.png)]
select * from student where id % 2 != 0;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5F5zLiU-1582008065213)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215145159005.png)]
select * from student where not id % 2 != 0;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Ab628yk-1582008065214)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215145253480.png)]
select * from calss where id in (select id from student);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APw4O5vt-1582008065215)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215145510027.png)]
select * from student where name like'sha%';
select * from student where name like 'shar_'
select * from student limit 5;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sQGMWX42-1582008065215)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215150821183.png)]
select * from student limit 0,6;
select * from student limit 6 offset 0;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4wY5WTe-1582008065216)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215151126392.png)]
select * from student order by age asc; select * from student order by age;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jpmdME7o-1582008065216)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215152703973.png)]
select * from student order by age desc;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QA5HBdZM-1582008065217)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215152848252.png)]
select * from student order by age desc,class_id asc;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6iXN1ZOl-1582008065218)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215153110740.png)]
select * from student group by age;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WSiqvi3F-1582008065218)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215154001972.png)]
注意:
分组成功后只会去显示其分组后的第一条记录
select * from student group by class_id,age;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PzOBHFtY-1582008065220)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215194344460.png)]
select * from student where age>19 group by age order by age;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fsLytaiV-1582008065222)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215194813226.png)]
注意:
group by 必须在where之后,order by之前
select age,id,count(*),sum(age),max(age),min(age) from student group by age,id;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9DO7OKg-1582008065223)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215195506645.png)]
select * from student group by age having max(id) <10;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5F7luTOJ-1582008065224)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215200035331.png)]
select * from(select name from student where age>18 and age < 25 order by id desc limit 2 )as tt;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9w0C0Dvi-1582008065225)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200215200307035.png)]
查询到 每个班级的所有学员的姓名
select calss.name,student.name from calss,student where student.class_id=class_id;
查询到 云计算1901班级的所有学员的姓名
select calss.name,student.name from calss,student where student.class_id='云计算1901' and student.class_id=class_id;
查询到 马邦德 是哪个班级的
select student.name as user,calss.name as users from student,calss where student.name='马邦德' and student.class_id=class_id;
查询老师 奇哥 都负责哪些班级
select t.name,c.name from teacher as t ,calss as c,class2teacher c2t where t.name='奇哥' and c2t.teacher_id=t.id and c2t.class_id=c.id;
表的连接- 无对应关系则不显示
select A.name,B.name
from calss as A,teacher as B
where A.id=B.id;
建立链接,对应关系的连在一起,无对应关系的不会显示
内连接- 无对应关系则不显示
select A.name,B.name
from calss as A inner join teacher as B
where A.id=B.id;
以上两种方式得到结果相同
左连接- 左边的表(A)所有显示,如果右边的表(B)中无对应关系,则值为null
select A.name,B.name
from calss as A left join teacher AS B
on A.id=b.id;
右连接-右边的(B)表所有显示,如果左边的表(A)中无对应关系,则值为 NULL
SELECT A.name,B.name
from calss as A right join teacher as B
on a.name=B.id;
/*无对应关系则不显示*/
select A.class_name, B.name
from class as A, teacher as B
Where A.id = B.class_id
/* 内连接 无对应关系则不显示*/
select A.class_name, B.name
from class as A inner join teacher as B
on A.id = B.class_id
/* 左连接 左边的表(A)所有显示,如果右边的表(B)中无对应关系,则值为null*/
select A.class_name, B.name
from class as A left join teacher as B
on A.id = B.class_id
/* 右连接 右边的(B)表所有显示,如果左边的表(A)中无对应关系,则值为 NULL*/
select A.name, B.name
from class as A right join teacher as B
on A.id = B.class_id
delete from 表名 [where 条件] [order by 排序的字段 [desc 取反]] [limit 限定的行数];
drop 直接删掉表
truncate 删除表中数据,再插入时自增长id又从1开始
delete 删除表中数据,可以加where字句, 增长 id 会继续增长。
(1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2) 表和索引所占空间。当表被TRUNCATE后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
(3) 一般而言,drop > truncate > delete
(4) 应用范围。TRUNCATE只能对TABLE;DELETE可以是table和view(视图)
(5)TRUNCATE和DELETE只删除数据,而DROP则删除整个表(结构和数据)。
(6)truncate与不带where的delete:只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(7)delete语句为DML(data maintain Language),这个操作会被放到rollback segment中,事务提交后才生效。如果有相应的tigger,执行的时候将被触发。
(8)truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚
(9) 在没有备份情况下,谨慎使用drop与truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。
(10)Truncate table表名 速度快,而且效率高,因为:
truncate table 在功能上与不带 WHERE 子句的DELETE语句相同:二者均删除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少。DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(11)TRUNCATE TABLE删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用DELETE。如果要删除表定义及其数据,请使用DROP TABLE 语句。
(12) 对于由FOREIGN KEY约束引用的表,不能使用TRUNCATE TABLE,而应使用不带WHERE子句的DELETE语句。由于TRUNCATE TABLE不记录在日志中,所以它不能激活触发器。
update 表名 set 字段名1=值表达式1,字段名2=值表达式2,....[where条件] [order排序] [limit限定];
以“行”为单位进行的,可以指定只更新其中的部分字段
其他限定遵循insert语法
清空表的内容,表本身还在。
delete from 表名 /*自增列的值继续递增,可以加 where 子句*/
truncate table 表名 /*自增列的值重新从 1 开始*/
/*删除表中的所有数据,自增列的值继续递增*/
delete from tb1;
/*删除表中的某些数据,被删除的数据的自增列的值将不会再次出现,自增列的值继续递增*/
delete from tb1 where id < 20;
drop table 表名 /*整个表将不复存在*/
-- 清空表数据
TRUNCATE [TABLE] 表名
-- 复制表结构
CREATE TABLE 表名 LIKE 要复制的表名
-- 复制表结构和数据
CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名
-- 检查表是否有错误
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
-- 优化表
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
-- 修复表
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
-- 分析表
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name]
索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。这比按顺序读取每一行要快得多。
类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。
本质上是告诉数据库的存储引擎如何快速找到我们所要的数据。所以 MySQL 的索引是在 MySQL 的存储引擎层实现的,而不是在其服务器层实现。
普通索引仅有一个功能:加速查询
create table t1(
id int not null auto_increment primary key,
name varchar(32),
email varchar(64),
extra text,
index ix_name(name)
/*添加索引到列名 name, 索引名为 ix_name*/
)
create index index_name on 表名称(列名称)
Example
create index index_name on student(name);
show index from 表名称;
Example
show index from student;
DROP INDEX index_name on 表名称;
Example
DROP INDEX index_name on student;
加速查询 和 唯一约束(可含null)
create table t2(
id int not null auto_increment primary key,
name varchar(32),
email varchar(64),
unique index ix_name (name)
);
create unique index 索引名 on 表名(列名);
ALTER TABLE 表名 DROP INDEX 索引名;
加速查询 和 唯一约束(不可含null)
当一个列被创建为主键是,它就会被赋予主机索引的属性。
create table t3(
id int ,
name varchar(32) ,
email varchar(64) ,
primary key(name)
);
联合索引是将n个列联合成一个索引,其应用场景为:频繁的同时使用 n 个列来进行查询,如:where name = ‘shark’ and age = 18。
create table studens(
id int not null auto_increment primary key,
name varchar(32) not null,
age int not null,
)
create index idx_name_age on students(name,age);
如上创建联合索引之后,查询时可以这么用:
name and age – 使用索引
where name='shark' and age=18;
name – 使用索引
where name='shark';
匹配最左前缀的查询
对于联合索引的使用上需要注意,
where
自己的第一个条件的列名必须是组合索引列的最左边的那个。
where name='shark';
where name='shark' and age>18;
where name = 'shark' and (age >18 or age = 10);
注意:
对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并。
name like 'shark%'
name > 'a' and name < 'c'
不可以使用 not in 和 <>
当有 3 列组成的索引时, 使用这个联合索引时,所有的字段不能跳过。
order_sn, order_name,order_date
where order_sn = ‘8998’ and order_date = ‘20191010’;
只能使用到 order_sn 这一个字段度索引,不能使用的 order_sn, order_date 的联合索引
explain select name from t1 where name='shark'\G
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KNq0PRtV-1582008065225)(C:\Users\void\AppData\Roaming\Typora\typora-user-images\image-20200216131134764.png)]
DCL(Data Control Language 数据库控制语言)
用于数据库授权、角色控制等操作
GRANT
授权,为用户赋予访问权限
REVOKE
取消授权,撤回授权权限
create user '用户名'@'客户端来源IP地址' identified by '密码';
drop user '用户名'@'客户端来源IP地址';
rename user '用户名'@'客户端来源IP地址' to '新用户名'@'客户端来源IP地址' ;
set password for '用户名'@'IP地址'=Password('新密码')
alter user '用户名'@'客户端来源IP地址' identified by '新密码';
UPDATE mysql.user SET authentication_string=password('QFedu123!') WHERE user='root' and host='localhost';
用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
grant 权限 on 数据库.表 to '用户'@'客户端来源IP地址' identified by '密码';
revoke 权限 on 数据库.表 from '用户'@'客户端来源IP地址'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eg6BUrQD-1582008065226)(C:\Users\void\Desktop\11414906-cc6bf8a4095296ef.webp)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O96Vmyw9-1582008065227)(C:\Users\void\Desktop\11414906-b35c753b7ca23306.webp)]
show grants for '用户'@'客户端来源IP地址';
针对所有库和表的权限,比如 *.*
。 去 mysql.user
中查看
select * from mysql.user where user='shark'\G
针对具体到库的权限,比如db_name.*
。 去 mysql.db
中查看
select * from mysql.db where user='shark'\G
针对具体表的授权,在 mysql.tables_priv
中查看
select * from mysql.tables_priv where user='shark'\G
假如是 MySQL8.x
CREATE USER '你的用户名'@'localhost' IDENTIFIED BY '你的密码';
#创建新的用户
GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'localhost';
#把刚刚创建的数据库的管理权限给予刚刚创建的MySQL用户
FLUSH PRIVILEGES;
#刷新权限,使用设置生效
参考官方文档
all privileges 除grant外的所有权限
select 仅查权限
select,insert 查和插入权限
...
usage 无访问权限
alter 使用alter table
alter routine 使用alter procedure和drop procedure
create 使用create table
create routine 使用create procedure
create temporary tables 使用create temporary tables
create user 使用create user、drop user、rename user和revoke all privileges
create view 使用create view
delete 使用delete
drop 使用drop table
execute 使用call和存储过程
file 使用select into outfile 和 load data infile
grant option 使用grant 和 revoke
index 使用index
insert 使用insert
lock tables 使用lock table
process 使用show full processlist
show databases 使用show databases
show view 使用show view
update 使用update
reload 使用flush
shutdown 使用mysqladmin shutdown(关闭MySQL)
super 使用change master、kill、logs、purge、master和set global。还允许mysqladmin调试登陆
replication client 服务器位置的访问
replication slave 由复制从属使用
对于目标数据库以及内部其他:
数据库名.* 数据库中的所有
数据库名.表 指定数据库中的某张表
数据库名.存储过程 指定数据库中的存储过程
*.* 所有数据库
用户名@IP地址 用户只能在此 IP 下才能访问
用户名@192.168.1.% 用户只能在此 IP 段下才能访问(通配符%表示任意)
用户名@%.shark.com
用户名@% 用户可以再任意IP下访问(默认IP地址为%)
create user 'shark'@'%';
grant all privileges on *.* to 'shark'@'%' identified by '123';
/*将数据读取到内存中,从而立即生效。*/
flush privileges
也可以在创建用户的同时直接授权(mysql8.x 不可以)
grant select on *.* /*设置查询数据的权限在所有的库和表*/
to 'shark_2'@"%" /*指定用户名和来源 ip*/
identified by '123'; /*设置密码*/
为何要备份
备份的目的
InnoDB
或任何其他表,或文件系统级命令(如cp, scp,tar, rsync)InnoDB
以及它备份的其他表。InnoDB
以及它备份的其他表。NDB
表。InnoDB
以及它备份的其他表。NDB
表。InnoDB
以及它备份的其他表。NDB
表。InnoDB
以及它备份的其他表。NDB
表。CREATE DATABASE
, CREATE TABLE
语句)和内容(INSERT
语句或分隔文本文件)的信息。此类备份适用于较少量的数据,您可以在其中编辑数据值或表结构,或在不同的计算机体系结构上重新创建数据。逻辑备份方法具有以下特征:
SELECT ... INTO OUTFILE
语句。这些适用于任何存储引擎,甚至MEMORY
。LOAD DATA INFILE
语句或 mysqlimport客户端在MySQL服务器运行时进行联机备份,以便可以从服务器获取数据库信息。服务器停止时会发生脱机备份。这种区别也可以描述为“ 热 ”与 “ 冷 ”备份; 一个“ 温暖 ”的备份是一个在服务器保持运行,但锁定,以防止当你从外部访问数据库文件修改数据。
在日常工作中,我们会使用 mysqldump 命令创建SQL格式的转储文件来备份数据库。或者我们把数据导出后做数据迁移,主从复制等操作。mysqldump是一个逻辑备份工具,复制原始的数据库对象定义和表数据产生一组可执行的SQL语句。 默认情况下,生成insert语句,也能生成其它分隔符的输出或XML格式的文件。
show master status\G;
锁表机制
mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
/*查看帮助*/
mysqldump --help
备份所有库
// 先配置用户名和密码
shell> vi ~/.mysql_user
[mysqldump]
user=root
password=123
shell> mysqldump --defaults-file=~/.mysql_user -h172.16.153.10 --all-databases > `date +%FT%H_%M_%S`dump_all.sql
# 不包含 INFORMATION_SCHEMA,performance_schema,sys
备份指定的多个库
// 为了考虑篇幅,请自行添加指定用户名密码参数和指定服务器的参数
// --defaults-file=~/.mysql_user -hip
shell> mysqldump --databases db1 db2 db3 > `date +%FT%H_%M_%S`dump_all.sql
备份指定库的指定几个表
shell> mysqldump db1 t1 t3 t7 > dump.sql
备份时不锁表
备份时希望转储和刷新日志到恰好在同一时刻发生,适用于 InnoDB
引擎
shell> mysqldump --all-databases --single-transaction --flush-logs > `date +%FT%H_%M_%S`dump_all.sql
–flush-logs 在开始备份数据之前刷新MySQL服务器日志文件。
此选项需要 RELOAD权限。如果将此选项与选项结合使用 --all-databases,则会为每个转储的数据库刷新日志。会锁表。–single-transaction 是针对 InnoDB 引擎的表,不锁表,也称热备。
其他参数
–master-data=0|1|2
服务器的二进制日志必须打开
0 不记录二进制日志文件及位置:
1 以CHANGE MASTER TO 的方式记录位置,可用于恢复后直接启动从服务器:
2 以CHANGE MASTER TO 的方式记录位置,但默认被注释:
–dump-slave 用于在slave上dump数据,建立新的slave。因为我们在使用mysqldump时会锁表,所以大多数情况下,我们的导出操作一般会在只读备库上做,为了获取主库的Relay_Master_Log_File(二进制日志)和Exec_Master_Log_Pos(主服务器二进制日志中数据所处的位置),需要用到这个参数,不过这个参数只有在5.7以后的才会有
–no-data, -d 不导出任何数据,只导出数据库表结构
–lock-all-tables:锁定所有表 对MyISAM引擎的表开始备份前,先锁定所有表。
mysqldump的优势:
shell> mysql < dump.sql
或者,在mysql中,使用 source
命令:
mysql> source dump.sql
如果文件是不包含CREATE DATABASE
和 USE
语句的单数据库转储 ,请首先创建数据库(如有必要):
shell> mysqladmin create db1
然后在加载转储文件时指定数据库名称:
shell> mysql db1 < dump.sql
或者,在mysql中创建数据库,将其选为默认数据库,然后加载转储文件:
mysql> CREATE DATABASE IF NOT EXISTS db1;
mysql> USE db1;
mysql>source dump.sql
Example
shell> mysql --defaults-file=~/.mysql_user < /backup/2016-12-08-04-mysql-all.sql
Percona XtraBackup是一款基于MySQL的热备份的开源实用程序,它可以备份5.1到5.7版本上InnoDB,XtraDB,MyISAM存储引擎的表, Xtrabackup有两个主要的工具:xtrabackup、innobackupex 。
原来的版本
(1)xtrabackup
只能备份InnoDB和XtraDB两种数据引擎的数据表,而不能备份MyISAM数据表
(2)innobackupex
则封装了 xtrabackup
,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁。
新版本的变化
如果你安装了2.3之前版本的xtrabackup,那么在备份的过程中,你可能会用到两个常用的备份工具。
安装2.3版本之前的XtraBackup后,我们会得到两个主要的备份工具:
xtrabackup是一个C程序。
innobackupex是一个perl脚本,它对xtrabackup这个C程序进行了封装,在备份innodb表时,此脚本会调用xtrabackup这个C程序。
如果使用xtrabackup这个C程序进行备份,则只能备份innodb和xtradb的表,不能备份myisam表。
如果使用innobackupex进行备份,则可以备份innodb或xtradb的表,同时也能够备份myisam表。
所以,一般在使用XtraBackup备份工具进行数据备份时,通常会选择使用innobackupex命令进行备份。
那么问题来了。
xtrabackup是一个C程序,innobackupex是一个perl脚本,当它们作为两个进程运行时,总是没有特别完美的方式让它们进行通讯,当它们作为一个整体进行工作时就不太尽如人意,如此情况,就导致了一些bug的出现,于是,官方决定使用C重写innobackupex,将它与xtrabackup这个C程序完美的整合在一起。这个想法在2.3版本的XtraBackup中实现。
官方手册解释
xtrabackup
一个已编译的C二进制文件,它提供了使用MyISAM,InnoDB和XtraDB表备份整个MySQL数据库实例的功能
而我们安装的就是2.4版本,此时,innobackupex的功能已经完全整合到了xtrabackup中,innobackupex不再是perl脚本了,但是,为了兼容之前用户的使用习惯,官方保留了innobackupex,它作为一个软连接,指向了xtrabackup,也就是说,在2.4版本中,不管我们使用innobackupex命令,还是xtrabackup命令,其实使用的都是这个xtrabackup
C程序。虽然在实现上有所不同,但是在工作原理上,与之前的版本并没有什么不同。
下面我们用新的命令xtrabachup
使用。
首先我们先来简单的了解一下xtrabackup
是怎么工作的。xtrabackup
基于innodb的crash-recovery(实例恢复)功能,先copy innodb的物理文件(这个时候数据的一致性是无法满足的),然后进行基于redo log进行恢复,达到数据的一致性。
YUM
方式安装地址
https://www.percona.com/downloads/XtraBackup/LATEST/
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
libev
yum install -y libev
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
shell> yum list | grep percona
应该输出如下信息
...
percona-xtrabackup-20.x86_64 2.0.8-587.rhel5 percona-release-x86_64
percona-xtrabackup-20-debuginfo.x86_64 2.0.8-587.rhel5 percona-release-x86_64
percona-xtrabackup-20-test.x86_64 2.0.8-587.rhel5 percona-release-x86_64
percona-xtrabackup-21.x86_64 2.1.9-746.rhel5 percona-release-x86_64
percona-xtrabackup-21-debuginfo.x86_64 2.1.9-746.rhel5 percona-release-x86_64
percona-xtrabackup-22.x86_64 2.2.13-1.el5 percona-release-x86_64
percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el5 percona-release-x86_64
percona-xtrabackup-debuginfo.x86_64 2.3.5-1.el5 percona-release-x86_64
percona-xtrabackup-test.x86_64 2.3.5-1.el5 percona-release-x86_64
percona-xtrabackup-test-21.x86_64 2.1.9-746.rhel5 percona-release-x86_64
percona-xtrabackup-test-22.x86_64 2.2.13-1.el5 percona-release-x86_64
...
shell> yum install percona-xtrabackup-24
点击 下载页面,选择对应版本后进行下载
image.png
示例:
下载 2.4.4
版本
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
安装
yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
注意:像这样手动安装软件包时,您需要确保解决所有依赖项并自行安装缺少的软件包。
yum remove percona-xtrabackup
注意:
这个版本只支持 MySQL8.0的数据进行备份,不支持 MySQL8.0版本之前的数据进行备份。
# 安装仓库文件
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
# 启用仓库
percona-release enable-only tools release
#安装软件
yum install percona-xtrabackup-80
来自 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona 的无效 GPG 密钥:No key found in given key data
或者
源 "CentOS 7 - Percona" 的 GPG 密钥已安装,但是不适用于此软件包。请检查
源的公钥 URL 是否配置正确。
失败的软件包是:Percona-Server-shared-56-5.6.43-rel84.3.el7.x86_64
GPG 密钥配置为:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona
修改仓库文件 percona-release.repo
不使用密钥认证
image.png
再次安装会看到如下报错信息
Transaction check error:
file /etc/my.cnf from install of Percona-Server-shared-56-5.6.43-rel84.3.el7.x86_64 conflicts with file from package mysql-community-server-5.7.25-1.el7.x86_64
错误概要
-------------
需要安装如下软件
yum install -y mysql-community-libs-compat
注意:
这个软件的源是mysql57-community
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
文件内容如下:
点我传送门
yum install percona-xtrabackup-24
条件:
- 在 MySQL 服务器本地安装 Xtrbackup 并执行相关操作。
- 给执行备份到用户进行相应的授权。
配置选项
配置选项可以在sh
命令行中直接使用,也可以在 my.cnf
文件中配置
# my.cnf 文件的配置
[xtrabackup]
target_dir = /data/backups/mysql/ # 备份数据放置的位置
假如是编译安装的 mysql ,需要在配置文件my.cnf
中指定 socket 文件的路径。
[xtrabackup]
socket = /tmp/mysql.sock
下面的命令均假设没有在 my.cnf
中配置任何关于 xtrabackup 的选项
要执行备份需要指定 备份数据放置的位置,就是目录,假如目录不存在,则会自动创建;==注意这个目录不会被递归创建,仅仅会创建最后一级目录;==假如存在,就会直接开始备份,并且不会覆盖原来的数据。
shell> xtrabackup --backup --user=root --password='123' --target-dir=/backups/full
# 备份完成后,可以看到备份时的LSN号,当下次进行增量备份时,xtrabackup就只备份大于此号的page即可。
[root@mysql-master ~]# ls -lh /backups/full
总用量 13M
-rw-r----- 1 root root 487 8月 18 09:44 backup-my.cnf
-rw-r----- 1 root root 293 8月 18 09:44 ib_buffer_pool
-rw-r----- 1 root root 12M 8月 18 09:44 ibdata1
drwxr-x--- 2 root root 4.0K 8月 18 09:44 mysql
drwxr-x--- 2 root root 88 8月 18 09:44 one_db
drwxr-x--- 2 root root 8.0K 8月 18 09:44 performance_schema
drwxr-x--- 2 root root 58 8月 18 09:44 shark_db
drwxr-x--- 2 root root 8.0K 8月 18 09:44 sys
-rw-r----- 1 root root 115 8月 18 09:44 xtrabackup_checkpoints
-rw-r----- 1 root root 446 8月 18 09:44 xtrabackup_info
-rw-r----- 1 root root 2.5K 8月 18 09:44 xtrabackup_logfile
进入目录后,可以看到一些目录,这些目录与我们数据库的名称相同,没错,这些就是各个数据库的数据文件备份目录。
还有一个innodb的共享表空间文件,ibdata1,注意,如果想要使用xtrabackup备份众多数据库中的某一个,那么必须保证在创建这个数据库时,已经开启了innodb_file_per_table
参数,否则将无法单独备份数据库服务器中的某一个数据库。
除了刚才描述的这些数据文件,xtrabackup还为我们生成了一些文件,我们来看看这些文件都有什么用(不同版本的xtrabackup生成的文件可能不同)。
backup-my.cnf
此文件中包含了my.cnf中的一些设置信息,但是,并不是my.cnf中的所有信息都会包含在此文件中,此文件中只包含了备份时需要的信息。
xtrabackup_binlog_info
需要开启二进制日志
此文件中记录了备份开始时二进制日志文件的"位置(position)"
xtrabackup_checkpoints
此文件中记录此次备份属于那种类型的备份,是全量还是增量,备份时起始的LSN号码,结束的LSN号码等信息。
xtrabackup_info
本次备份的概要信息,此文件中的信息还是比较全面的。
xtrabackup_logfile
记录了备份过程中的日志,在对数据进行prepare时需要通过日志将数据还原成一致的可用的数据。
准备恢复的数据
使用 xtrabackup --backup
选项进行备份后,并不能直接使用,首先需要准备它以便还原它。
如果您尝试使用这些数据文件启动 InnoDB,它将检测损坏并自行崩溃,以防止您在损坏的数据上运行。
因为备份出的数据是不一致的,我们需要将同时备份出的事务日志应用到备份中,才能得到一份完整、一致、可用的数据,xtrabackup称这一步操作为prepare,直译过来就是"准备"。
xtrabackup --prepare
步骤使文件在同一时刻内的数据完全一致
shell> xtrabackup --prepare --target-dir=/backups/full
如果你要备份的数据量巨大,那么备份时长会变长,期间备份的事务日志容量有可能会很大。那么,我们可以使用–use-memory选项,加速准备工作的完成,在不指定内存大小的情况下,准备工作默认会占用100MB的内存,如果服务器有一定的空闲内存,那么我们可以让xtrabackup使用指定大小的内存完成准备工作,以提升准备工作完成的速度,示例语句如下。
shell> xtrabackup --prepare --use-memory=512M --target-dir=/backups/full
准备备份时不建议中断xtrabackup进程,因为这可能会导致数据文件损坏,备份将无法使用。如果准备过程中断,则无法保证备份有效性。
准备备份数据完成后,应该会看到如下信息。
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 13596200
180818 10:09:19 completed OK!
恢复
xtrabackup 在执行copyback时会读取数据库的my.cnf中的配置,但是如果my.cnf中没有配置datadir,那么–datadir选项必须存在,而且,datadir目录必须为空目录,其中不能存在数据,否则在执行上述命令时会报错,–copy-back选项对应的目录就是我们准备好的可用数据的目录。
为了能够正常的恢复数据,我们先确定数据库服务已经停止了,而且对应的数据目录中不存在数据,然后进行数据还原工作,删除数据目录中的文件与日志。
shell> systemctl stop mysqld.service
shell> rm -rf /var/lib/mysql/*
shell> xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/full
# 下面为完成后的输出结果
180818 10:59:25 [01] ...done
180818 10:59:25 completed OK!
shell> chown mysql.mysql -R /var/lib/mysql
或者使用 rsync
命令
shell> rsync -avrP /data/backup/ /var/lib/mysql/
shell> chown mysql.mysql -R /var/lib/mysql
启动数据库
shell> systemctl start mysqld.service
innobackuper 命令实现
shell> innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.146 --user=root --password=123 /backups/full
shell> nnobackupex --apply-log --use-memory=4G /backup/full/2018-08-17_15-53-11
shell> systemctl stop mysqld.service
shell> rm -rf /var/lib/mysql/*
shell> innobackupex --datadir=/var/lib/mysql --copy-back 2018-08-17_15-53-11
shell> chown mysql.mysql -R /var/lib/mysql
shell> systemctl start mysqld.service
全量备份思路总结
/var/lib/mysql/
此目录必须是空的image.png
特点:每次备份,都对自上一次备份(注意是上一次,不是第一次)到此时备份之间有变化的文件,进行备份。所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时持续的时间长。
无论xtrabackup和innobackupex工具支持增量备份,这意味着它们可以只复制自上次备份以来发生变化的数据。
您可以在每个完整备份之间执行许多增量备份,因此您可以设置备份过程,例如每周一次完整备份和每天增量备份,或每天完整备份和每小时增量备份。
增量备份有效,因为每个InnoDB页面都包含一个日志序列号或LSN。该LSN是整个数据库系统的版本号。每个页面的LSN显示它最近的更改。
当我们做过全量备份以后会在目录下产生xtrabackup_checkpoints的文件 这里面记录了lsn和备份方式,我们可以基于这次的全量做增量的备份。
shell> cat /data/backups/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 13593159
last_lsn = 13593168
compact = 0
recover_binlog_info = 0
增量备份实际上并不将数据文件与先前备份的数据文件进行比较。事实上,如果你知道它的LSN,你可以使用 xtrabackup --incremental-lsn
来执行增量备份,而不需要先前的备份。增量备份只是读取页面并将其LSN与最后一个备份的LSN进行比较。但是,您仍需要完整备份来恢复增量更改;如果没有完整备份作为基础,增量备份将毫无用处。
创建增量备份
要进行增量备份,请像往常一样以完整备份开始, 使用下面的命令创建基础的全量备份。
shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/base
现在您已拥有完整备份,以后可以根据它进行增量备份。
向数据库中添加数据,以便于测试
mysql> select count(id) from shark_db.student;
+-----------+
| count(id) |
+-----------+
| 99213 |
+-----------+
1 row in set (0.04 sec)
mysql> insert into shark_db.student (name,age,phone) values('xiguatian',20,13149876789);
Query OK, 1 row affected (0.00 sec)
mysql> select count(id) from shark_db.student;
+-----------+
| count(id) |
+-----------+
| 99214 |
+-----------+
1 row in set (0.03 sec)
使用以下命令进行增量备份:
shell> xtrabackup --backup --user=root --password=123 --target-dir=/data/backups/inc1 --incremental-basedir=/backups/base
该/data/backups/inc1/
目录现在应包含增量文件
ls -lh /data/backups/inc1/
总用量 116K
-rw-r----- 1 root root 487 8月 18 11:40 backup-my.cnf
-rw-r----- 1 root root 293 8月 18 11:40 ib_buffer_pool
-rw-r----- 1 root root 64K 8月 18 11:40 ibdata1.delta
-rw-r----- 1 root root 44 8月 18 11:40 ibdata1.meta
drwxr-x--- 2 root root 4.0K 8月 18 11:40 mysql
drwxr-x--- 2 root root 144 8月 18 11:40 one_db
drwxr-x--- 2 root root 8.0K 8月 18 11:40 performance_schema
drwxr-x--- 2 root root 88 8月 18 11:40 shark_db
drwxr-x--- 2 root root 8.0K 8月 18 11:40 sys
-rw-r----- 1 root root 120 8月 18 11:40 xtrabackup_checkpoints
-rw-r----- 1 root root 498 8月 18 11:40 xtrabackup_info
-rw-r----- 1 root root 2.5K 8月 18 11:40 xtrabackup_logfile
这个时候去查看增量备份的xtrabackup_checkpoints,会发现同样也记录了LSN 等信息
shell> cat /backups/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 13596423
to_lsn = 13596628
last_lsn = 13596637
compact = 0
recover_binlog_info = 0
// 这也意味着你可以在增量的备份上继续增量的备份。
from_lsn是备份的起始LSN,对于增量,它必须与前一个/基本备份的to_lsn(如果它是最后一个检查点)相同。
上面的情况是,to_lsn
(上一个检查点LSN)和last_lsn
(上次复制的LSN)之间存在差异,这意味着在备份过程中服务器上存在一些流量
模拟增加数据
mysql> insert into shark_db.student (name,age,phone) values('xiguatian3',21,13149876789);
Query OK, 1 row affected (0.01 sec)
mysql> select count(id) from shark_db.student; +-----------+
| count(id) |
+-----------+
| 99215 |
+-----------+
1 row in set (0.03 sec)
现在可以使用此目录作为另一个增量备份的基础:
shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1
准备增量备份的数据
增量备份的步骤与完全备份的步骤不同。在完全备份中,执行两种类型的操作以使数据库保持一致:从日志文件中针对数据文件重播已提交的事务,并回滚未提交的事务。在准备增量备份时,必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行中,并且很可能它们将在下一次增量备份中提交。您应该使用该 选项来阻止回滚阶段.
xtrabackup --apply-log-only
警告
如果不使用该 选项来阻止回滚阶段,那么增量备份将毫无用处。回滚事务后,无法应用进一步的增量备份。
要准备数据,需要从一开始就准备,现在回想一下我们都有那些备份
/backups/base
/backups/inc1
/backups/inc2
image.png
准备基础备份的数据
shell> xtrabackup --prepare --apply-log-only \
--target-dir=/backups/base
...省略...
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 13596441
InnoDB: Number of pools: 1
180818 11:56:55 completed OK!
注意:
即使已跳过回滚阶段,此备份实际上也可以按原样恢复。如果你恢复它并启动MySQL,InnoDB将检测到没有执行回滚阶段,它将在后台执行,因为它通常用于启动时的崩溃恢复。它会通知您数据库未正常关闭。
shell> xtrabackup --prepare --apply-log-only --user=root --password=123 --target-dir=/backups/base --incremental-dir=/backups/inc1
shell> xtrabackup --prepare --user=root --password=123 --target-dir=/backups/base --incremental-dir=/backups/inc2
注意: 最后一次操作不需要加 --apply-log-only
参数
shell> systemctl stop mysqld
shell> rm -rf /var/lib/mysql/*
shell> xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/base/
shell> chown mysql.mysql -R /var/lib/mysql
shell> systemctl start mysqld
--compress
// 压缩备份
shell> xtrabackup --backup --compress --target-dir=/backups/compressed
// 可以同时启用 4 个线程进行压缩
shell> xtrabackup --backup --compress --compress-threads=4 --target-dir=/backups/compressed/
准备恢复数据
首先要解压备份文件
安装依赖的软件
shell> wget -d --user-agent="Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0"http://www.quicklz.com/qpress-11-linux-x64.tar
shell> tar xvf qpress-11-linux-x64.tar
shell> cp qpress /usr/bin
使用压缩
shell> xtrabackup --decompress --target-dir=/backups/compressed/
// --parallel 参数可以和 --decompress 参数一起使用,可以实现同时解压多个文件
解压后就可以进行准备恢复的数据操作了
shell> xtrabackup --prepare --target-dir=/backups/compressed/
shell> xtrabackup --copy-back --target-dir=/backups/full
shell> chown -R mysql:mysql /var/lib/mysql
要创建加密的备份需要指定至少两个选项:
--encrypt=ALGORITHM
目前支持的算法是: AES128
,AES192
和AES256
--encrypt-key=ENCRYPTION_KEY
使用适当长度的加密密钥。如果命令行无法控制访问机器,则不建议使用此选项,因此可以将密钥视为流程信息的一部分。--encrypt-key-file=KEYFILE
可以从中读取适当长度的原始密钥的文件的名称。该文件必须是一个简单的二进制(或文本)文件,其中包含要使用的密钥。[root@mysql-master /]# openssl rand -base64 24
2t3RHNrCZfBNuzdqxCTaI80PS6kkPNVP
// 或者创建一个密钥文件
shell> echo -n "2t3RHNrCZfBNuzdqxCTaI80PS6kkPNVP" >
/data/backups/keyfile
在某些情况下,文本文件可能包含CRLF,这将导致密钥大小增大,从而使其无效。建议的方法是使用以下命令创建文件:
echo -n "GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" > /backups/keyfile
xtrabackup --backup \
--target-dir=/backups \
--encrypt = AES256 \
--encrypt-key="2t3RHNrCZfBNuzdqxCTaI80PS6kkPNVP"
或者
--encrypt-key-file=/data/backups/keyfile
xtrabackup --decrypt=AES256 \
--encrypt-key="2t3RHNrCZfBNuzdqxCTaI80PS6kkPNVP" \
--target-dir=/backups/
或者
--encrypt-key-file=/backups/keyfile
剩余的操作和之前的恢复数据的操作一样
echo -n "GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" > /backups/keyfile
xtrabackup支持在启用innodb_file_per_table选项时进行部分备份。创建部分备份有三种方法:
使用--tables
选项
第一种方法是--tables
选项。选项的值是一个正则表达式,它与表单中的完全限定的表名(包括数据库名称)相匹配.
比如,仅备份数据库 shark_db
中的所有表
shell> xtrabackup --backup \
--user=root \
--password=123 \
--datadir=/var/lib/mysql \
--target-dir=/backups/shark_db_all \
--tables="^shark_db[.].* | ^mysql[.].*|^sys[.].*|^per.*|information_schema[.].*"
仅备份 shark_db.student
表
shell> xtrabackup --backup \
--user=root \
--password=123 \
--datadir=/var/lib/mysql \
--target-dir=/backups/shark_db.student \
--tables="^shark_db[.]student|^mysql[.].*|sys[.].*|^per.*|informatio_schema[.].*"
// 参考默认表名
| information_schema |
| mysql |
| performance_schema |
| sys |
+-----
使用 --tables-file
选项
该--tables-file
选项指定一个文件,该文件可以包含多个表名,文件中每行一个表名。仅备份文件中指定的表。名称完全匹配,区分大小写,没有模式或正则表达式匹配。表格名称必须是databasename.tablename
格式完全限定的。
shell> echo "mydatabase.mytable" > /tmp/tables.txt
shell> xtrabackup --backup --tables-file=/tmp/tables.txt
使用--databases
和--databases-file
选项
该--databases
选项接受以空格分隔的要备份的数据库和表的列表.
该--databases-file
选项指定一个文件,该文件可以包含databasename[.tablename]
表单中的多个数据库和表,文件中每行一个元素名称。仅备份命名的数据库和表。名称完全匹配,区分大小写,没有模式或正则表达式匹配。
这两个选项和之前提到的--tables 和 --tables-file 选项是否方式几乎一致。
所不同的是:
talbes 仅可以指定具体的表。
databases 即可以指定数据库名,也可以指定某个数据库中的表。
2.恢复部分备份
在部分备份上使用–prepare选项时,您将看到有关不存在的表的警告。这是因为这些表存在于InnoDB内的数据字典中,但相应的.ibd文件不存在。它们未被复制到备份目录中。
==这些表将从数据字典中删除,当您还原备份并启动InnoDB时,它们将不再存在,==并且不会导致任何错误或警告打印到日志文件中。
因为你之前只备份了部分备份的数据而已,自然恢复的时候不能恢复没有备份的数据。
shell> xtrabackup --prepare --target-dir=/backups/shark_db_all
方法一:
shell> xtrabackup --copy-back \
--datadir=/var/lib/mysql \
--target-dir=/backups/shark_db_all
// 更改权限
shell> chown mysql.mysql /var/lib/mysql -R
方法二:
适用于没有对 mysql 服务器默认的数据库(msql/sys/performance_schema)备份的情况
a. 初始化数据库
shell> mysqld --initialize --user=mysql
b. 复制文件准备好的备份文件到 mysql 的数据库目录
shell> rsync -avrP /backups/shark_db_all/ /var/lib/mysql/
c. 修改相关文件权限
shell> chown mysql.mysql /var/lib/mysql -R
d. 启动数据库
shell> systemctl start mysqld
e. 找到数据库密码,并登录数据库
shell> grep password /var/log/mysqld.log
shell> mysql -uroot -p # 回车之后,输入在上一步找到的密码
f. 修改数据库密码
mysql> alter user 'root'@'localhost' identified by '123';
假如目前 MySQL
服务器是 DB1
远程用于备份到服务器是 BK1
DB1
到 BK1
的信任关系shell> ssh-copy-id user@DK1
DB1
中安装支持多线程压缩和压缩算法的软件shell> yum install pigz # 支持多线程压缩
shell> wget -d --user-agent="Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0"http://www.quicklz.com/qpress-11-linux-x64.tar
shell> tar xvf qpress-11-linux-x64.tar
shell> cp qpress /usr/bin
DB1
中执行备份命令xtrabackup --backup --user=mysqluser --password=password --stream=xbstream | ssh user@BK1 "cat - > /mysql_backup.tar.gz"
上面命令的意思是,把备份压缩后的文件以数据流的格式传输给 ssh ,并通过 ssh 传输给远程服务器 BK1
, 备份后的文件名为 mysql_backup.tar.gz
--user
和--password
指定的是在 MySQL 服务上经过授权的用户和密码
--stream
指定的是采用流格式进行同步压缩
恢复数据
xb
格式的数据流压缩的,所以解压的时候,也需要使用 xb
工具解压文件到本地硬盘。mkdir -p /data/xb
xbstream -x < mysql_backup.tar.gz -C /data/xb
-databases-file选项指定一个文件,该文件可以包含
databasename[.tablename]`表单中的多个数据库和表,文件中每行一个元素名称。仅备份命名的数据库和表。名称完全匹配,区分大小写,没有模式或正则表达式匹配。
这两个选项和之前提到的--tables 和 --tables-file 选项是否方式几乎一致。
所不同的是:
talbes 仅可以指定具体的表。
databases 即可以指定数据库名,也可以指定某个数据库中的表。
2.恢复部分备份
在部分备份上使用–prepare选项时,您将看到有关不存在的表的警告。这是因为这些表存在于InnoDB内的数据字典中,但相应的.ibd文件不存在。它们未被复制到备份目录中。
==这些表将从数据字典中删除,当您还原备份并启动InnoDB时,它们将不再存在,==并且不会导致任何错误或警告打印到日志文件中。
因为你之前只备份了部分备份的数据而已,自然恢复的时候不能恢复没有备份的数据。
shell> xtrabackup --prepare --target-dir=/backups/shark_db_all
方法一:
shell> xtrabackup --copy-back \
--datadir=/var/lib/mysql \
--target-dir=/backups/shark_db_all
// 更改权限
shell> chown mysql.mysql /var/lib/mysql -R
方法二:
适用于没有对 mysql 服务器默认的数据库(msql/sys/performance_schema)备份的情况
a. 初始化数据库
shell> mysqld --initialize --user=mysql
b. 复制文件准备好的备份文件到 mysql 的数据库目录
shell> rsync -avrP /backups/shark_db_all/ /var/lib/mysql/
c. 修改相关文件权限
shell> chown mysql.mysql /var/lib/mysql -R
d. 启动数据库
shell> systemctl start mysqld
e. 找到数据库密码,并登录数据库
shell> grep password /var/log/mysqld.log
shell> mysql -uroot -p # 回车之后,输入在上一步找到的密码
f. 修改数据库密码
mysql> alter user 'root'@'localhost' identified by '123';
假如目前 MySQL
服务器是 DB1
远程用于备份到服务器是 BK1
DB1
到 BK1
的信任关系shell> ssh-copy-id user@DK1
DB1
中安装支持多线程压缩和压缩算法的软件shell> yum install pigz # 支持多线程压缩
shell> wget -d --user-agent="Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0"http://www.quicklz.com/qpress-11-linux-x64.tar
shell> tar xvf qpress-11-linux-x64.tar
shell> cp qpress /usr/bin
DB1
中执行备份命令xtrabackup --backup --user=mysqluser --password=password --stream=xbstream | ssh user@BK1 "cat - > /mysql_backup.tar.gz"
上面命令的意思是,把备份压缩后的文件以数据流的格式传输给 ssh ,并通过 ssh 传输给远程服务器 BK1
, 备份后的文件名为 mysql_backup.tar.gz
--user
和--password
指定的是在 MySQL 服务上经过授权的用户和密码
--stream
指定的是采用流格式进行同步压缩
恢复数据
xb
格式的数据流压缩的,所以解压的时候,也需要使用 xb
工具解压文件到本地硬盘。mkdir -p /data/xb
xbstream -x < mysql_backup.tar.gz -C /data/xb