MySQL
关系型数据库以一行作为一个记录,列数据库以一列为一个记录一行是一个记录,一列是一个字段一行是一个实体,一列是一个属性
MySQL引擎:
MySQL引擎:可以理解为,MySQL的“文件系统”,只不过功能更加强大。MySQL引擎功能:除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能。和磁盘打交道,mysql中组织。1.什么是外键:外键的主要作用是保持数据的一致性、完整性。2.什么是索引:索引相当于书中的目录,可以提高数据检索的效率,降低数据库的IO。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的3.什么是事务:事务是由一步或几步数据库操作这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolatio >)和持续性(Durability)。这四个特性也简称ACID性。(1)原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,具有不可再分>的特征一样。事务是应用中不可再分的最小执行体。(最小了,不可再分了)(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态>。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(说罢了就是白狗变成了黑狗,不能出现斑点狗!)(3)隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都>是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。(说白了,就是你做你的,我做我的!)(4)持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录>到永久存储器中,通常是保存进物理数据库。(说白了就是一条道跑到黑)4.什么是行锁与锁表:可以将一张表锁定和可以单独锁一行的记录。为了防止你在操作的同时也有别人在操作。
常见的MySQL引擎
InnoDBMyIsamMemory(也叫HEAP)堆内存Blackhole(黑洞引擎)异地主从Archive(归档引擎)
MySQL类型:
数值类型TINYINTSMALLINTMEDIUMINTINTBIGINT浮点类型FLOATDOUBLEDECIMAL字符串类型charvarcharbinaryvarbinarytextblob enum 枚举类型set 集合类型日期时间类型datetimedatetimetimestamp 自动存储记录插入或更新的日期和时间
约束条件:
表完整性约束作用:用于保证数据的完整性和一致性==============================================================约束条件 说明NOT NULL 标识该字段不能为nullDEFAULT 为该字段设置默认值UNSIGNED 无符号(正数)ZEROFILL 使用0填充,例如0000001UNIQUE KEY (UK) 标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEYAUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)说明:1. 是否允许为空,默认NULL;可设置NOT NULL,字段不允许为空,必须赋值2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值sex enum('male','female') not null default 'male'age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
安装
yum安装MySQL:
yum安装MySQL1.官方获取yum源---->MySQL.com1).清理缓存yum clean all && yum makecache && yum repolist2.修改yum源1).使用vim交互修改2).yum -y install yum-utils使用yum-config-manager --disable mysql80-communityyum-config-manager --enable mysql57-community3).临时生效(不需要安装)yum -y install mysql-community-server --disablerepo mysql80-community --enablerepo msyql57-community3.yum安装MySQLyum -y isntall msyql-community-server4.启动数据库(第一次启动,初始化数据库)systemctl start mysqld5.配置文件 /etc/my.cnf数据目录/var/lib/mysql日志文件/var/log/mysqld.log6.获取临时密码grep password /var/log/mysqld7.修改密码mysqladmin -uroot -p'临时密码' password '新密码'8.修改密码强度策略vim /etc/my.cnfvalidate-password=OFF9.忘记MySQL数据库root用户密码:vim /etc/my.cnf添加:skip-grant-tables(跳过验证表,它和修改密码强度策略不能同时存在)desc mysql.userselect * from mysql.userupdate mysql.user set authentication_string=password("QianFeng012345") where User='root' and Host="localhost";
源码安装:
源码安装1. 获取源码包wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.24.tar.gz2. 准备编译环境和依赖yum -y install ncurses ncurses-devel openssl-devel bison libgcrypt gcc gcc-c++ make cmake3. 添加MySQL用户useradd -M -s /bin/nologin mysql4. 解压tar xf mysql-boost-5.7.24.tar.gztar -xf 源码包5. 创建自定义路径mkdir -p /opt/{mysql,config,data,log,tmp}chown -R mysql:mysql /opt/{mysql,config,data,log,tmp}6.cmake ...cmake . \-DWITH_BOOST=boost/boost_1_59_0/ \-DCMAKE_INSTALL_PREFIX=/opt/mysql \-DSYSCONFDIR=/etc \-DMYSQL_DATADIR=/opt/data \-DINSTALL_MANDIR=/usr/share/man \-DMYSQL_TCP_PORT=3306 \-DMYSQL_UNIX_ADDR=/opt/tmp/mysql.sock \-DDEFAULT_CHARSET=utf8 \-DEXTRA_CHARSETS=all \-DDEFAULT_COLLATION=utf8_general_ci \-DWITH_SSL=system \-DWITH_EMBEDDED_SERVER=1 \-DENABLED_LOCAL_INFILE=1 \-DWITH_INNOBASE_STORAGE_ENGINE=17.编译make -j `lscpu | awk 'NR==4{print $2}'`8.编译安装make install9.准备配置文件vim /opt/config/my.cnf[mysqld]basedir = /opt/mysql #安装目录datadir = /opt/data #数据存放目录tmpdir = /opt/tmp #/tmp缓存目录socket = /opt/tmp/mysql.sock #指定socket文件的位置pid_file = /opt/tmp/mysqld.pid #指定pid文件的位置log_error = /opt/log/mysql_error.log #错误日志的位置slow_query_log_file = /opt/log/slow_warn.log #慢日志查询10.初始化cd /opt/mysql/./bin.mysqld --user=mysql --default-file=/opt/config/my.cnf --initialize11.获取密码grep password /opt/log/mysql_error.log12.启动./bin/msyql_safe--user=mysql &13.修改密码./bin/mysqladmin -uroot -p'临时密码' password '新密码'14..停止数据库服务./bin/msyqladmin -uroot -p'新密码' shutdown15.cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqldsystemctl daemon-reloadsystemctl start msyqld16.配置环境变量echo 'export PATH=$PATH:/opt/mysql/bin' >> /etc/profilesource /etc/profile自己写文件vim /etc/profile.d/mysql.shexport MYSQL_HOME=/opt/mysqlexport PATH=$PATH:$MYSQL_HOME/binsource /etc/profile.d/mysql.sh
内网环境安装MySQL
内网环境安装MySQL1.配置本地源vim config_loacl_yum.shrm -f /etc/yum.repos.d/*echo '10.36.178.2 package.qf.com package2.qf.com' >> /etc/hostscurl -o /etc/yum.repos.d/centos.repo http://langlangago.org.cn/repo/centos7.repoyum clean all &>/dev/null && yum repolist2.yum -y install mysql-server
MYSQL语句:
show databases; 查看数据库表use mysql; 切换数据库selcet database();查看当前所在库create database sq_name default charset ['utf8' | 'utfmbi']; 创建库show create database sq_name; 展示创建数据库时是怎么创的use sq_name; 切换数据表create table teacher (name varchar(20),age int);desc teacher
MySQL结构语言介绍
数据查询语言(DQL:Data Query Language): 其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词。数据操作语言(DML:Data Manipulation Language): 其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。 数据控制语言(DCL):(Data Control Language): 它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。数据定义语言(DDL):(Data Define Language): 其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
基础操作:
授权远端登录
1.创建用户并设置密码create user 'root'@'%' identified by 'password'2.给创建的用户所有权限grant all on *.* to 'root'@'%';3.刷新表结构flush privileges
基础命令:
-- 数据库的基本操作-- 连接数据库mysql -u用户名 -p密码 -h主机地址 -P端口 -S 套接字文件mysql.sock /var/lib/mysql/mysql.sock-- 查看数据库SHOW DATABASES;-- 查看表SHOW TABLES;-- 查看数据库版本SELECT VERSION();-- 查看当前所在库SELECT DATABASE();-- 查看当前登录的用户SELECT USER();-- 切换库USE db1;-- 查看表SHOW TABLES;-- 创建库CREATE DATABASE db1 DEFAULT CHARSET 'utf8';-- 创建表CREATE TABLE teacher (id INT);-- 修改表名 (在业务高峰期间不用做此操作)RENAME TABLE teacher TO tb_teacher;ALTER TABLE tb_teacher RENAME teacher;-- 查询表里的数据SELECT * FROM teacher;-- 删除表DROP TABLE teacher;-- 删除库DROP DATABASE db1;
DDL表的操作:
DDL --- 数据定义语言,其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。-- 创建sanguo数据库CREATE DATABASE sanguo DEFAULT CHARSET 'utf8';-- 在sanguo数据库中创建shuguo表CREATE TABLE sanguo.shuguo (id INT PRIMARY KEY AUTO_INCREMENT COMMENT "自增id",`name` CHAR(20) NOT NULL COMMENT "人物姓名", `alias`VARCHAR(20) NOT NULL COMMENT "人物的字",`arms` VARCHAR(20) NOT NULL COMMENT "人物的武器",`birth`DATE COMMENT "人物出生日期",`daed` int COMMENT "人物死亡年龄")-- 切换库use sanguo-- 查看字段DESC shuguo-- 增加字段ALTER TABLE shuguo ADD gender ENUM('男','女') NOT NULL DEFAULT '男';alter table shuguo add hobby set ('方天画戟专捅义父','捅你一万个透明窟窿') not null first-- 给字段添加索引alter table shuguo add index 索引名字(字段);-- 更改字段位置alter table shuguo add age int not null after `name`;--修改字段alter table shuguo modify name varchar(20)alter table shuguo modify `name` varchar(20)alter table shuguo change `name` `xiaoming` varchar(20);alter table shuguo change `xingming` `name` char(20)alter table shuguo change `name` `name` varchar(20)--更换字段位置不改字段名ALTER TABLE shuguo CHANGE `daed` `dead` int AFTER gender-- 删除字段alter table shuguo drop `hobby`-- 复制表结构create table weiguo select * from shuguo where 1==2;-- 复制一模一样的表sqlcreate table weiguo select * from shuguo;-- 复制某一些字段create table weiguo1 select id,`name`,age from shuguo where 1=2;
DML操作表的数据
DML ---数据操作语言(动作查询语言)其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。-- 插入数据insert into shuguo (`name`,age,alias,arms,birth,dead)values('刘备','30','玄德','双股剑','2024-05-23','60')-- 插入多个数据insert into shuguo (`name`,age,alias,arms,birth,dead)values('关羽','25','云长','青龙偃月刀','2024-04-23','50'),('张飞','20','翼德','丈八蛇矛','2024-03-23','40')-- 修改数据update shuguo set age=30 where id=1-- 清空所有数据delete from shuguotruncate table shuguo(比较快)-----table 可加可不加-- 清空指定数据delete from shuguo where id=1;
DQL表的查询
单表查询
CREATE TABLE company.employee5(`id` int primary key AUTO_INCREMENT not null,`name` varchar(30) not null,`sex` enum('male','female') default 'male' not null,`hire_date` date not null,`post` varchar(50) not null,`job_description` varchar(100),`salary` double(15,2) not null,`office` int,`dep_id` int);-- 查询工资5000的员工select `name`,salary from company.employee5 where salary=5000;-- 查询工资大于5000的员工select `name`,salary from company.employee5 where salary>5000;-- 查询每个员工的一年总工资select `name`,salary *15 from company.employee5-- 查询每一个员工一年总工资并把打印出来的表头设为sum_salaryselect `name`,salary *15 as sum_salary from company.employee5;select `name`,salary *15 sum_salary from company.employee5;-- 查询2017年入职公司的员工-- 遍历整张表 %通配符select `name`,hire_date from company.employee5 where hire_date like %2017%-- 大于2016-12-31并小于2018-01-01select `name`,hire_date from company.employee5 where hire_date > "2016-12-31" and hire_date < "2018-01-01";-- 在2016-12-31和2018-01-01之间select `name`,hire_date from company.employee5 where hire_date between "2016-12-31" and "2018-01-01"-- 取字段左边四个字符=2017select `name`,hire_date from company.employee5 where left(hire_date,4)="2017" -- 正则表达式regexp 匹配字段中数据含有"2017"的字符select `name`,hire_date from company.employee5 where regexp "2017+"-- 排序-- 将字段中数据升序排列select `name`,`salary` from company.employee5 order by salary;-- 将字段给中数据降序排列select `name`,`salary` from company.employee5 order by salary desc;-- 去字段中数据的前三行可以结合降序使用select `name`,`salary` from company.employee5 order by salary limit 3 -- 拼接字段-- as month_salary 将查询出来的表头修改为 month_salaryselect concat(`naem`,一个月工资是:,`salary`) as month_salary from company.employee5-- 查询字段中数据有多少种-- 去重select distinct(post) from company.employee5; -- 分组查询-- 以第一个字段分组将第二个字段中数据相同的合并查询出来select sex,group_concat(`name`) from company.employee5 group by sex-- in从集合里面取值-- 查询id为1,3,5-- or 只要该字段能找到就会展示select id,`name`from company.employee5 where id=1 or id=3 or id=5;-- in 只取in集合里的select id,`name`from company.employee5 where id in (1,3,5);-- not in 不包含in集合里的select id,`name`from company.employee5 where not in (1,3,5);-- null -- 查询某些字段中某个字段为nullselect id,`name`,job_description from company.employee5 where `job_description` is null-- 查询某些字段中某个字段不为nullselect id,`name`,job_description from company.employee5 where `job_description` is not null-- 函数-- 查询表里有都少条数据select count(1) from company.employee5-- 查询某个字段中最大的数据select max(salary) from company.employee5-- 查询某个字段中最小的数据并设置表头select min(salary) as `min`from company.employee5-- 查询某个字段中数据的平均值select avg(salary) from company.employee5-- 查询某个字段中数据的总值select sum(salary) from company.employee5-- 查询当前所在的库select database();-- 查询当前所登录的用户select user();-- 查询当前的时间select now();-- 查询某个字段中数据最大的并且是那个select `name`,salary from company.employee5 where salary=(select max(salary) from company.employee5)
多表查询
多表查询 多表连接查询交叉连接:生成笛卡尔积,它不使用任何匹配条件 了解就好,这个生产用会把数据库跑死内连接 :只连接匹配的行外连接:(了解)左连接:会显示左边表内所有的值,不论在右边表内匹不匹配右连接:会显示右边表内所有的值,不论在左边表内匹不匹配全外连接:(了解) 包含左、右两个表的全部行复合条件连接查询子查询
内连接:
-- 内连接-- 使用whereselect 表1.字段,表2.字段 from 表1,表2 where 表1.字段=表2.字段eg : select employee6.emp_id,employee6.emp_name,employee6.age,department6.dept_namefrom employee6,department6 where employee6.dept_id = department6.dept_id;-- 别名select a.emp_id,a.emp_name,a.age,b.dept_name from employee6 a,department6 b where a.dept_id = b.dept_id;-- 使用inner join (inner可以省略)select 表1.字段,表2.字段 from 表1 inner join 表2 on 表1.字段=表2.字段eg : select a.emp_id,a.emp_name,a.age,b.dept_name from employee6 a inner join department6 b on a.dept_id = b.dept_id;
外连接
-- 外连接-- 左外连接select 字段列表 from 表1 left join 表2 on 表1.字段=表2.字段;eg : select emp_id,emp_name,dept_name from employee6 left join department6 on employee6.dept_id = department6.dept_id;-- 右外连接select 字段列表 from 表1 right join 表2 on 表1.字段=表2.字段;eg : select emp_id,emp_name,dept_name from employee6 right join department6 on employee6.dept_id = department6.dept_id;
复合条件连接查询
-- 复合条件连接查询-- 以内连接的方式查询表1,表2,并且表1中某个字段值必须大于25select 表1.字段,表2.字段 from 表1,表2 where 表1.字段=表2.字段 and 表1.字段>25;eg : select emp_id,emp_name,age,dept_name FROM employee6,department6 WHERE employee6.dept_id=department6.dept_id AND age > 25;-- 以内连接的方式查询表1,表2 并且表1中某个字段以升序方式显示select 表1.字段,表2.字段 from 表1,表2 where 表1.字段=表2.字段 order by 表1.字段 asceg : SELECT emp_id,emp_name,age,dept_name FROM employee6,department6 where employee6.dept_id=depaartment6.dept_id ORDER BY age asc;
子查询
-- 子查询子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果,可以为外层查询语句提供查询条件子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字还可以包含比较运算符:= 、 !=、> 、<等-- 查询表2.字段数据1,数据2的表1.字段数据select 表1.字段,表2.字段 from 表1 join 表2 on 表1.字段=表2.字段eg1 : select e.emp_name,d.dept_name from employee6 e join department6 d on e.dept_id=d.dept_id;eg2 : select * from employee6 where dept_id in (select dept_id from department6 where dept_name in ("hr","it"));-- 1. 带IN关键字的子查询-- 查询表1,但表2.字段必须在表1中出现过select * from 表1 where 表1.字段 in(select 表2.字段 from 表2)eg : SELECT * FROM employee6 WHERE dept_id IN (SELECT dept_id FROM department6);-- 2.带比较运算符的子查询-- =,!=,>,>=,<,<=,<>-- 查询表1字段数据大于25岁的字段2所在表2的字段数据select 表2.字段,表2.字段 from 表2 where 表2.字段 in(select distinct 表1.字段 from表1 where 表1.字段>=25 );eg : SELECT dept_id,dept_name FROM department6 WHERE dept_id IN (SELECT DISTINCT dept_id FROM employee6 WHERER age >= 25);
DCL(数据库控制语言)
用于数据库授权、角色控制等操作`GRANT` 授权,为用户赋予访问权限`REVOKE` 取消授权,撤回授权权限
用户管理:
创建用户create user '用户名'@'客户端来源IP地址' identified by '密码';mysql> create user newrain@'192.168.62.%' identified by '123';删除用户drop user '用户名'@'客户端来源IP地址';mysql> drop user newrain@'192.168.62.%';修改用户rename user '用户名'@'客户端来源IP地址' to '新用户名'@'客户端来源IP地址' ;mysql> rename user newrain@'192.168.62.%' to ehome@'%';修改密码// 第一种方法:set password for '用户名'@'IP地址'=Password('新密码')mysql> set password for ehome@'%'=Password('123');// 第二种方法:alter user '用户名'@'客户端来源IP地址' identified by '新密码';// 第三种方法(忘记密码时,必须使用此方法修改密码):UPDATE mysql.user SET authentication_string=password('QFedu123!') WHERE user='root' and host='localhost';===root修改自己密码# mysqladmin -uroot -p'123' password 'new_password' //123为旧密码案例:# mysqladmin -uroot -p'123' password 'qf@123';
权限管理:
grant 权限 on 数据库.表 to '用户'@'客户端来源IP地址' identified by '密码'; -- 授权并设置密码revoke 权限 on 数据库.表 from '用户'@'客户端来源IP地址' -- 取消权限grant select on Company.employee to 'ehome'@'%' identified by 'Qianfeng@123'revoke select on Company.employee from 'ehome'@'%'grant all privileges on company.* to ehome@'%';revoke all privileges on company.* from ehome@'%';flush privileges; #关于权限方面的修改,注意刷新权限,否则有可能不生效
查看授权信息
查看授权语句show grants for '用户'@'客户端来源IP地址'; show grants for ehome@'%';查看生效的授权信息针对所有库和表的权限,比如 `*.*` 。 去 `mysql.user` 中查看SELECT * from mysql.user WHERE user='root'\GSELECT * from mysql.user WHERE user='ehome'\G针对具体到库的权限,比如`db_name.*` 。 去 `mysql.db` 中查看sqlSELECT * from mysql.db WHERE user='ehome'\G
MySQL安全控制:
1.确保MySQL运行用户为一般用户groupadd mysql# useradd -M -s /sbin/nologin -g mysql mysql # vim /etc/my.cnfuser = mysql#注意点:改变拥有者和所属组对于mysql的安装目录2.建议修改默认端口3306,改为其他的一些端口# vim /etc/my.cnfport = 3306 falseport = 10086 true3.开启mysql二进制日志,在误删除数据的情况下,可以通过二进制日志恢复到某个时间点# vim /etc/my.cnflog_bin = othername4.删除空口令账号drop user 'newrain'@'localhost';
MySQL备份
备份
show variables 查看mysql所有的变量show variables like 'sec%' 查看备份数据路径1.逻辑备份 [MySQLdump]<50Gmyqsldump -u用户 -p密码 -h主机 (ip) -P端口 -S 套接字文件-- 全库备份 mysqldump -uroot -p'pd' [-A | --all-datebases ] > all_db.sql-- 库级备份 -B 必须加mysqldump -uroot -p'pd' [-B | --databasae] db1_name db2_name > db.sql-- 表级备份mysqldump -uroot -p'pd' db_name tb1_name tb2_name > tb.sql-- 备份表结构 -dmysqldump -uroot -p'pwd' db_name tb1_name tb2_name -d > tb.sql-- 备份表数据select * from 库.表 into outfile '/var/lib/mysql-files/user.xlsx'-- 远程备份-- 注意:远程备份数据库,需要远程服务器也有mysql服务mysqldump -h ip -uroot -p'pwd' -B db_name >db_sql
恢复
1.恢复-- 恢复库1.1 mysql -uroot -p'pwd' < db.sql1.2 msyql -uroot -p'pwd' mysql > source /root/db.sql1.3 cat db.sql | mysql -uroot -p'pwd'-- 恢复表1.1 mysql -uroot -p'pwd' db_name < tb.sql1.2 mysql -uroot -p'pwd'mysql> use db_namemysql> source /root/tb.sql1.3 cat tb.sql | mysql -uroot -p'pwd' db_name-- 恢复表结构1.1 mysql -uroot -p'pwd' db_name < tb.sql1.2 mysql -uroot -p'pwd'mysql> use db_name mysql> source /root/tb.sql1.3 cat tb.sql | mysql -uroot -p'pwd' db_name-- 恢复表数据msyql> 准备表结构 (可以用复制表结构来准备)mysql> load data infile '/var/lib/mysql-files/user.xlsx' into table 表名;
binlog日志
-- binlog日志备份恢复show master status\G -- 查看当前存储binlog日志是那个文件flush logs; -- 手动刷新binlog日志reset master -- 重置bin-log1.开启binlog日志vim /etc/my.cnf[mysqld]log-bin=/var/lib/mysql/mysql-binserver_id=12.恢复先把丢失之前备份的数据恢复出来解析mysqlbinlog /var/lib/mysql/mysql-bin.000001 --base64-output=decode-rows -v查找posBEGINat 123....commitat 456mysqlbinlog --start-position 123 --stop-position 456 /var/lib/mysql/mysql-bin.000001 | mysql -uroot -p'pwd' 库名
物理备份
全量备份恢复
全量备份innobackupex --user=root --password=密码 /路径全量恢复1.停止数据库systemctl stop mysqld2.重演--apply-log --redo-onlyinnobackupex --user=root --password=密码 --apply-log --redo-only /全量备份数据目录3.清理数据rm -rf /var/lib/mysql/*4.拷贝数据--copy-backinnobackupex --user=root --password=密码 --copy-back /全量目录5.修改权限chown -R mysql.mysql *6.启动数据库
增量备份恢复
增量备份第一次增量innobackupex --user=root --password=密码 --incremental /增量备份数据目录 --incremental-basedir=/基于上次全量备份目录第二次增量innobackupex --user=root --password=密码 --incremental /第二次增量备份数据目录 --incremental-basedir=/基于第一次增量备份目录增量恢复1.停止数据库systemctl stop mysqld2.重演--apply-log --redo-only2.1)重演全量备份数据innobackupex --user=root --password=密码 --apply-log --redo-only /全量备份数据目录2.2)将增量备份数据重演到已经重演的全量备份数据里innobackupex --user=root --password=密码 --apply-log --redo-only /重演过的全量备份数据目录 --incremental-dir=/曾量备份数据目录3.清理数据rm -rf /var/lib/mysql/*4.拷贝数据--copy-backinnobackupex --user=root --password=密码 --copy-back /重演过的全量目录5.修改权限chown -R mysql.mysql *6.启动数据库
差异备份恢复
差异备份第一次备份innobackupex --user=root --password=密码 --incremental /差异备份数据目录 --incremental-basedir=/基于全量备份目录第二次差异备份innobackupex --user=root --password=密码 --incremental /第二次差异备份数据目录 --incremental-basedir=/基于第一次差异备份目录差异恢复1.停止数据库systemctl stop mysqld2.重演--apply-log --redo-only2.1)重演全量备份数据innobackupex --user=root --password=密码 --apply-log --redo-only /全量备份数据目录2.2)将差异备份数据重演到已经重演的全量备份数据里innobackupex --user=root --password=密码 --apply-log --redo-only /重演过的全量备份数据目录 --incremental-dir=/差异备份数据目录3.清理数据rm -rf /var/lib/mysql/*4.拷贝数据--copy-backinnobackupex --user=root --password=密码 --copy-back /重演过的全量目录5.修改权限chown -R mysql.mysql *6.启动数据库
MySQL主从复制
原理:
无数据
1.所需环境1.1 准备两台服务器 关闭防火墙和selinux 1.2 修改主机名hostnamectl set-hostname 主机名1.3 配置主机名解析vim /etc/hosts1.4 添加主库ip 主库主机名从库ip 从库主机名1.5 同步时间ntpdate ntp.aliyun.comtime.windos.com1.6 固定ipcurl langlangago.org.cn/os/static_ip.sh | sh1.7 配置本地源rm -rf /etc/yum.repos.d/curl -o /etc/yum.repos.d/centos.repohttp://www.langlangago.org.cn/repo/centos7.repo && yum clean all && yum repolist1.8 安装数据库yum -y install mysql-server1.9 启动mysqlsystemctl start mysqld1.10 修改密码grep password /var/lib/mysqld.logmysqladmin -uroot -p'原始密码' password '新密码'[主库]开启bin-log日志创建存放bin-log日志目录mkdir -p /目录名修改目录的所属者和所属主chown -R mysql.mysql /目录进入配置文件添加vim /etc/my.cnf[mysqld]server_id=1log-bin=/目录名/mysql-bin进入数据库授权主从复制的账号mysql> grant replication slave on *.* to '用户名'@'%' identified by '密码';刷新授权表mysql> flush privileges;查看当前存放bin-log在那个文件mysql> show master status;[从库]开启bin-log日志创建存放bin-log日志目录mkdir -p /目录名修改目录的所属者和所属主chown -R mysql.mysql /目录进入配置文件添加vim /etc/my.cnf[mysqld]server_id=1log-bin=/目录名/mysql-bin进入数据库编辑配置文件mysql> change master to> master_host='主机名',> master_user='用户名',> master_password='密码',> master_port='端口',> master_log_file='存放bin-log的文件',> master_log_pos=postion的开始数字;启动主从服务mysql> start slave;[重新设置slave]reset slave;查看是否配置成功mysql> show slave status\G[注意]第13.14行两个YES表示主从复制正常Slave_IO_Running: YesSlave_SQL_Running: Yes第21.22行 表示错误码和错误信息Last_Errno: 0Last_Error:第35行 表示主从复制是否有延迟Seconds_Behind_Master: 0
有数据
[主库]1.开启bin-log日志创建存放bin-log日志目录mkdir -p /目录名修改目录的所属者和所属主chown -R mysql.mysql /目录进入配置文件添加vim /etc/my.cnf[mysqld]server_id=1log-bin=/目录名/mysql-bin进入数据库授权主从复制的账号mysql> grant replication slave on *.* '用户名'@'%' identified by '密码';刷新授权表mysql> flush privileges;查看当前存放bin-log在那个文件mysql> show master status;另开一个终端备份mysqldump -uroot -p'密码' -B 库名 > /路径/文件名.sql[锁表]flush table with read lock;[注意 : 锁表面试有可能会问到 比如 : 做主从配置如何保证数据的完整性并数据不丢失]远程拷贝scp /路径/文件名 ip: /路径[从库]1. 开启bin-log日志创建存放bin-log日志目录mkdir -p /目录名修改目录的所属者和所属主chown -R mysql.mysql /目录进入配置文件添加vim /etc/my.cnf[mysqld]server_id=1log-bin=/目录名/mysql-bin[导入备份主库的数据]mysql> source /路径/文件名进入数据库编辑配置文件mysql> change master to> master_host='主机名',> master_user='用户名',> master_password='密码',> master_port='端口',> master_log_file='存放bin-log的文件',> master_log_pos=postion的开始数字;[解锁]关闭终端启动主从服务mysql> start slave;查看是否配置成功mysql> show slave status\G
gtid主从配置
1.干净的环境2.[主库]进入/etc/my.cnf添加[mysqld]log-bin=/var/log/mysql/mysql-binserver-id=1#打开gtid模式gtid_mode=ONenforce_gtid_consistency=1 重启服务systemctl start mysqld[从库]vim /etc/my.cnf #在配置文件中添加配置 [mysqld]server-id=2#打开gtid模式gtid_mode=ONenforce_gtid_consistency=1 重启服务systemctl start mysqld3.其他操作和主从配置一样[注意]开启gtid后导入和导出数据需要添加参数[--set-gtid-purged=OFF]mysqldump -uroot -p'密码' --set-gtid-purged=OFF 库名> /路径/文件名
MySQL读写分离
原理:
Mycat(2主2从的数据库结构)
1.从官网下载jdk,mycat并解压修改解压后包的名字mv 解压后报的名字 /jdk2.配置jdk全局变量vim /etc/profile/添加export PATH=/解压的目录/jdk/bin:$PATH3.生效source /etc/profile4.部署mycat进入配置文件4.1 vim /mycat/conf/server.xml##删除注释和其余,留下面的<!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:server xmlns:mycat="http://io.mycat/">[下面的用户和密码是应用程序连接到 MyCat 使用的.schemas 配置项所对应的值是逻辑数据库的名字,这个名字需要和后面 schema.xml 文件中配置的一致。]<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">TESTDB</property></user>
</mycat:server>4.2 vim /mycat/conf/schema.xml<mycat:schema xmlns:mycat="http://io.mycat/">[name='库名'假的库名,给应用程序java来连接 逻辑库名称,与server.xml的一致][checkSQLschema="false" 不检查sql ][sqlMaxLimit="100" 最大连接数 ][dataNode="dn1" 数据节点名称 ]<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>[ name="dn1" 此数据节点的名称][dataHost="localhost1" 主机组][database="test" 真实的数据库名称]<dataNode name="dn1" dataHost="localhost1" database="test" />[name="localhost1" 主机组][maxCon="1000" minCon="10" 最大最小连接数][balance="2" 负载均衡策略][writeType="0" 写模式的配置 ][dbType="数据库类型" dbDriver="native"数据库驱动 switchType="1" slaveThreshold="100" 数据库的配置]<dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">[用来检查数据库是否正常] <heartbeat>select user()</heartbeat>[读写的配置][writeHost host='主数据库名称' url='主数据库地址' user='用来连接的用户 ' password='用来连接用户的密码']<writeHost host="master" url="master:3306" user="mycat"password="Qianfeng@123">[readHost host='从数据库的名称' url='主数据库地址' user='用来连接的用户' password='用来连接用户的密码'] <readHost host="s1" url="s1:3306" user="mycat" password="Qianfeng@123" /></writeHost>[writeHost host='主数据库2的名称' url='主数据库2的地址' user='用来连接的用户' password='用来连接用户的密码'] <writeHost host="slave" url="slave:3306" user="mycat"password="Qianfeng@123">[readHost host='从数据库2的名称' url='主数据库2的地址' user='用来连接的用户' password='用来连接用户的密码'] <readHost host="s2" url="s2:3306" user="mycat" password="Qianfeng@123" /></writeHost></dataHost>
</mycat:schema>5.启动mycat/存放mycat的路径 start[支持以下参数]start | restart |stop | status6.在真是的master数据库给用户权限[注意 这里的用户和密码和schema.xml配置文件里读写配置用来连接的用户密码一致]mysql> grant all on *.* to mycat@'%' identified by 'Qianfeng@123';mysql> flush privileges;7.测试[-u和-p是server.xml写的用户和密码 -h是mycat的主机地址 -P是mycat监听的端口]mysql -uroot -p123456 -h -P8066用SQL语句去测试
balance和writeType属性
[balance 属性]负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。2. balance="1", 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。3. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。4. balance="3", 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。[writeType 属性]负载均衡类型
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。