[MySQL最详细的知识点]

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 true​3.开启mysql二进制日志,在误删除数据的情况下,可以通过二进制日志恢复到某个时间点# vim /etc/my.cnflog_bin = othername​4.删除空口令账号drop user 'newrain'@'localhost';

MySQL备份

备份
show variables  查看mysql所有的变量​show variables  like 'sec%' 查看备份数据路径​1.逻辑备份 [MySQLdump]<50G​myqsldump -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 mysqld​3.其他操作和主从配置一样​[注意]开启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 以后废弃不推荐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/22009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 分区

目标 给一个表&#xff08;半年有800万&#xff09;增加分区以增加查询速度 约束 分区不能有外键否则会报错 https://blog.csdn.net/yabingshi_tech/article/details/52241034 主键 按照时间列进行分区 https://blog.csdn.net/winerpro/article/details/135736454 参看以…

安全测试 之 常见安全漏洞:CORS

1. 背景 安全测试定义&#xff1a;安全测试&#xff0c;是在软件产品开发基本完成时&#xff0c;验证产品是否符合安全需求定义和产品质量标准的过程。目的&#xff1a;通过对系统进行全面的脆弱性安全测试&#xff0c;发现系统未知的安全隐患并提出相关建议&#xff0c;确保系…

BUAA操作系统万字笔记-课堂笔记-期末考试-考研必备-北航961系列

文章目录 1 概论1.1 CPU漏洞攻击1.2 操作系统简史1.2.1 体系结构1.2.2 系统发展 1.3 操作系统基本实现机制1.3.1 异常&#xff1a;陷阱和中断 2 系统引导3 内存管理3.1 预备知识-链接与装载3.2 存储管理基础3.2.1 存储器管理目标3.2.2 存储器硬件发展3.2.3 存储管理的功能3.2.4…

【python】成功解决“TypeError: not enough arguments for format string”错误的全面指南

成功解决“TypeError: not enough arguments for format string”错误的全面指南 一、引言 在Python编程中&#xff0c;TypeError: not enough arguments for format string错误是一个常见的字符串格式化问题。这个错误通常发生在使用str.format()方法时&#xff0c;提供的参数…

frp之XTCP实现内网穿透家用电脑远程桌面公司电脑

官网XTCP介绍 《XTCP介绍》 实现图 fprs.toml # frps 服务端口&#xff08;不填&#xff0c;则默认&#xff1a;7000&#xff09; bindPort 81 auth.token "token 令牌"公司电脑frpc.toml serverAddr "frps公网服务器域名或ip" serverPort frps 服…

Java图形用户界面程序设计所需要使用的工具

Java图形用户界面程序设计 前言一、图形用户界面程序设计的概述GUI概述Java GUI技术的发展 二、AWT概述简介AWT继承体系总结 三、Swing概述Swing概述优势Swing的特征总结 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣…

Python程序设计 身份证号的奥秘

第1关&#xff1a;判断性别 通过身份证的第17位也就是倒数第二位的数字可以辨别该身份证所属人的性别,奇数为男性,偶数为女性。 任务&#xff1a;输入身份证号&#xff0c;第17位若是偶数&#xff0c;输出男性&#xff0c;否则输出女性 如何截取字符串的一个字符 如何判断一个…

机器视觉检测--相机

一&#xff0c;相机就是CCD么&#xff1f; 通常&#xff0c;我们把相机都叫作CCD&#xff0c;CCD已经成了相机的代名词。其实很可能正在使用的是CMOS。CCD以及CMOS都称为感光元件&#xff0c;都是将光学图像转换为电子信号的半导体元件。他们在检测光时都采用光电二极管&#…

AI降痕:让AI代写的论文,也能成为原创佳作

随着人工智能技术的突飞猛进&#xff0c;AI生成内容&#xff08;AIGC&#xff09;已被广泛用于学术论文撰写中&#xff0c;提高效率同时也带来了原创性的挑战。面对日益严格的学术审查&#xff0c;一个突出的问题是&#xff1a;使用AI代写的论文能否通过内容检测&#xff1f;因…

【Postman接口测试】第四节.Postman接口测试项目实战(中)

文章目录 前言五、Postman断言 5.1 Postman断言介绍 5.2 响应状态码断言 5.3 包含指定字符串断言 5.4 JSON数据断言六、参数化 5.1 Postman参数化介绍 5.2 Postman参数化实现 5.3 针对项目登录接口参数化实现 总结 前言 五、Postman断言 5.1 Postman断言介…

【STM32之FreeRTOS(二)】任务的创建与删除

【STM32之FreeRTOS(二)】任务的创建与删除 文章目录 【STM32之FreeRTOS(二)】任务的创建与删除一、什么是任务&#xff1f;二、任务创建与删除相关函数1.任务创建与删除相关函数2.任务动态创建与静态创建的区别3.xTaskCreate 函数原型4.vTaskDelete 函数原型 三、实操(同时控制…

面试题:谈谈你对 JS 原型链的理解

面试题&#xff1a;谈谈你对 JS 原型链的理解 JavaScript 是一种基于原型的语言&#xff0c;即每个对象都拥有一个原型对象&#xff0c;对象通过其原型对象继承方法和属性。原型对象也有其原型对象&#xff0c;依次类推&#xff0c;就构成了原型链。当对象访问一个属性或方法后…

BioTech - 计算大量 蛋白质结构预测结果 的聚类中心(Cluster)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/139419653 CASP16 的 H0215 样本,聚类之后,10个类别的最高置信度结果。 Agglomerative Clustering,即凝聚层次聚类,属于层次聚类算法,通过逐步合并或聚集数据点,…

Qt-demo高级感无边框窗口、美化基础控件

展示&#xff1a; 代码实现&#xff1a; // 鼠标按下事件(记录拉伸窗口或移动窗口时的起始坐标&#xff08;左上角&#xff09;) void framelessWidget::mousePressEvent(QMouseEvent *event) {if(event->button() Qt::LeftButton){mousePressed true; #if (QT_VERSION &…

傅立叶变换矩阵的频谱响应

傅立叶变换矩阵的频谱响应 线性变换可以用矩阵表示&#xff0c;傅立叶变换是一种线性变换&#xff0c;因此也可以使用矩阵表示。具体可以参考&#xff1a;离散傅立叶变换和线性变换的关系&#xff1a;什么是线性空间&#xff1f; 1、傅立叶矩阵 X [ k ] ∑ n 0 N − 1 x [ …

【EI会议/稳定检索】2024年电机与电气控制国际会议(ICMEC 2024)

2024 International Conference on Motor and Electrical Control 2024年电机与电气控制国际会议 【会议信息】 会议简称&#xff1a;ICMEC 2024 截稿时间&#xff1a;(以官网为准&#xff09; 大会地点&#xff1a;中国厦门 会议官网&#xff1a;www.meciac.com 会议邮箱&…

每日十题---三

1. Vue中$nextTick原理 1. 简单的理解就是它就是一个setTimeout函数&#xff0c;将函数放到异步后去处理。 2. Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化&#xff0c;Vue 将开启一个队列&#xff0c;并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被…

海外仓代发系统选择标准:功能稳定和性价比高一个都不能少

对海外仓来说&#xff0c;一件代发基本都是比较核心的业务。不过这个核心业务现在的竞争确实也比较大&#xff0c;对海外仓企业而言&#xff0c;想在一件代发上做到让客户满意&#xff0c;还是需要多方面努力的。 一方面&#xff0c;需要自己的仓库管理模式足够标准化&#xf…

高校实验室危险化学品及重大危险源安全管理系统

高校实验室危险化学品及重大危险源安全管理的重要性&#xff1a; 保障师生安全&#xff1a;通过严格管理&#xff0c;可以有效地降低这些风险&#xff0c;确保师生在实验室内的安全。 确保实验教学质量&#xff1a;良好的危化品管理能够确保实验材料的准确性和可靠性&#xff0…

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(一)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失一些关键的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…