[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引擎

    
 InnoDB
     
     MyIsam
     
     Memory(也叫HEAP)堆内存
     
     Blackhole(黑洞引擎)异地主从
     
     Archive(归档引擎)

MySQL类型:

 数值类型
     TINYINT
     SMALLINT
     MEDIUMINT
     INT
     BIGINT
 浮点类型
     FLOAT
     DOUBLE
     DECIMAL
 字符串类型
     char
     varchar
     binary
     varbinary
     text
     blob        
     enum        枚举类型
     set         集合类型
 日期时间类型
     date
     time
     datetime
     timestamp       自动存储记录插入或更新的日期和时间

约束条件:

 
表完整性约束
 作用:用于保证数据的完整性和一致性
 ==============================================================
 约束条件                       说明
 NOT NULL            标识该字段不能为null
 DEFAULT             为该字段设置默认值
 UNSIGNED            无符号(正数)
 ZEROFILL            使用0填充,例如0000001
 UNIQUE KEY (UK)      标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
 AUTO_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安装MySQL
     1.官方获取yum源---->MySQL.com
         
         1).清理缓存
             yum clean all && yum makecache && yum repolist
     
     2.修改yum源
         1).使用vim交互修改
             
         2).yum -y install yum-utils
          使用yum-config-manager --disable mysql80-community
               yum-config-manager --enable mysql57-community
         
         3).临时生效(不需要安装)
             yum -y install mysql-community-server --disablerepo mysql80-community --enablerepo msyql57-community
     
     3.yum安装MySQL
         yum -y isntall msyql-community-server
     
     4.启动数据库(第一次启动,初始化数据库)
         systemctl start mysqld
     
     5.配置文件 
         /etc/my.cnf
       数据目录
         /var/lib/mysql
       日志文件
         /var/log/mysqld.log
     
     6.获取临时密码
         grep password /var/log/mysqld
     
     7.修改密码
         mysqladmin -uroot -p'临时密码' password '新密码'
     
     8.修改密码强度策略
         vim /etc/my.cnf
         validate-password=OFF
     
     9.忘记MySQL数据库root用户密码:
         vim /etc/my.cnf
         添加:skip-grant-tables(跳过验证表,它和修改密码强度策略不能同时存在)
         desc mysql.user
         select * from mysql.user
         update 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.gz
     
     2. 准备编译环境和依赖
         yum -y install ncurses ncurses-devel openssl-devel bison libgcrypt gcc gcc-c++ make cmake
     
     3. 添加MySQL用户
         useradd -M -s /bin/nologin mysql
     
     4. 解压
         tar xf mysql-boost-5.7.24.tar.gz
         tar -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=1
     
     7.编译
         make -j `lscpu | awk 'NR==4{print $2}'`
     
     8.编译安装
         make install
     
     9.准备配置文件
         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 --initialize
     
     11.获取密码
         grep password /opt/log/mysql_error.log
     12.启动
         ./bin/msyql_safe--user=mysql &
     
     13.修改密码
         ./bin/mysqladmin -uroot -p'临时密码' password '新密码'
     
     14..停止数据库服务
         ./bin/msyqladmin -uroot -p'新密码' shutdown
     
     15.cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
         systemctl daemon-reload
         systemctl start msyqld
     
     16.配置环境变量
         echo 'export PATH=$PATH:/opt/mysql/bin' >> /etc/profile
         source /etc/profile
         自己写文件
             vim /etc/profile.d/mysql.sh
             export MYSQL_HOME=/opt/mysql
             export PATH=$PATH:$MYSQL_HOME/bin
             source /etc/profile.d/mysql.sh
内网环境安装MySQL
内网环境安装MySQL
     1.配置本地源
     vim config_loacl_yum.sh
         rm -f /etc/yum.repos.d/*
         echo '10.36.178.2 package.qf.com package2.qf.com' >> /etc/hosts
         curl -o /etc/yum.repos.d/centos.repo http://langlangago.org.cn/repo/centos7.repo
         yum clean all &>/dev/null && yum repolist
     2.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;
 ​
 -- 复制一模一样的表sql
 create 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 shuguo
 truncate 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_salary
 select `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-01
 select `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"
     
     -- 取字段左边四个字符=2017
 select `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_salary
 select 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 
     -- 查询某些字段中某个字段为null
 select id,`name`,job_description from company.employee5 where `job_description` is null
     
     -- 查询某些字段中某个字段不为null
 select 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)
多表查询
多表查询 
     多表连接查询
         交叉连接:生成笛卡尔积,它不使用任何匹配条件  了解就好,这个生产用会把数据库跑死
         
         内连接  :只连接匹配的行
 ​
         外连接:(了解)
               左连接:会显示左边表内所有的值,不论在右边表内匹不匹配
               右连接:会显示右边表内所有的值,不论在左边表内匹不匹配
 ​
     全外连接:(了解)   包含左、右两个表的全部行
             复合条件连接查询
             子查询     
内连接:
-- 内连接
    -- 使用where
    select 表1.字段,表2.字段 from 表1,表2 where 表1.字段=表2.字段
 ​
 eg : select employee6.emp_id,employee6.emp_name,employee6.age,department6.dept_name
     from 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中某个字段值必须大于25
     select 表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.字段 asc
     
  eg : 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'\G
     
     SELECT * from mysql.user WHERE user='ehome'\G
     
     针对具体到库的权限,比如`db_name.*` 。 去 `mysql.db` 中查看sql
     
     SELECT * from mysql.db  WHERE user='ehome'\G

MySQL安全控制:

 1.确保MySQL运行用户为一般用户
     groupadd mysql
     # useradd -M -s /sbin/nologin -g mysql mysql 
 ​
     # vim /etc/my.cnf
     user = mysql
 ​
 #注意点:
     改变拥有者和所属组对于mysql的安装目录
 ​
 2.建议修改默认端口3306,改为其他的一些端口
     # vim /etc/my.cnf
     port = 3306 false
     port = 10086 true
 ​
 3.开启mysql二进制日志,在误删除数据的情况下,可以通过二进制日志恢复到某个时间点
     # vim /etc/my.cnf
     log_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
 ​
     -- 备份表结构 -d
     mysqldump -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.sql
     1.2 msyql -uroot -p'pwd' 
         mysql > source /root/db.sql
     1.3 cat db.sql | mysql -uroot -p'pwd'
     
     -- 恢复表
     1.1 mysql -uroot -p'pwd' db_name < tb.sql
     1.2 mysql -uroot -p'pwd'
         mysql> use db_name
         mysql> source /root/tb.sql
     1.3 cat tb.sql | mysql -uroot -p'pwd' db_name
     
     -- 恢复表结构
     1.1 mysql -uroot -p'pwd' db_name < tb.sql
     1.2 mysql -uroot -p'pwd'
         mysql> use db_name 
         mysql> source /root/tb.sql
     1.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-log
     1.开启binlog日志
         vim /etc/my.cnf
         [mysqld]
         log-bin=/var/lib/mysql/mysql-bin
         server_id=1
     
     2.恢复
      先把丢失之前备份的数据恢复出来
      解析
         mysqlbinlog /var/lib/mysql/mysql-bin.000001 --base64-output=decode-rows -v
      查找pos
         BEGIN
         at 123
         ....
         commit
         at 456
         mysqlbinlog --start-position 123 --stop-position 456 /var/lib/mysql/mysql-bin.000001 | mysql -uroot -p'pwd' 库名
物理备份
全量备份恢复
全量备份
     innobackupex  --user=root --password=密码  /路径
     
 全量恢复
     1.停止数据库
         systemctl stop mysqld
     2.重演
         --apply-log --redo-only
         innobackupex --user=root --password=密码 --apply-log --redo-only /全量备份数据目录
     3.清理数据
         rm -rf /var/lib/mysql/*
         
     4.拷贝数据
         --copy-back
         innobackupex --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 mysqld
     2.重演
         --apply-log --redo-only
         
         2.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-back
         innobackupex --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 mysqld
     2.重演
         --apply-log --redo-only
         
         2.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-back
         innobackupex --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/hosts
      
     1.4 添加
         主库ip 主库主机名
         从库ip 从库主机名
      
     1.5 同步时间
         ntpdate ntp.aliyun.com
                 time.windos.com
      
     1.6 固定ip
         curl langlangago.org.cn/os/static_ip.sh | sh
      
     1.7 配置本地源
         rm -rf /etc/yum.repos.d/

         curl -o /etc/yum.repos.d/centos.repo
         http://www.langlangago.org.cn/repo/centos7.repo && yum clean all && yum repolist
     
     1.8 安装数据库
         yum -y install mysql-server
     
     1.9 启动mysql
         systemctl start mysqld
     
     1.10 修改密码
         grep password /var/lib/mysqld.log
         mysqladmin -uroot -p'原始密码' password '新密码'
 ​
 [主库]
     开启bin-log日志
     创建存放bin-log日志目录
         mkdir -p /目录名
     
     修改目录的所属者和所属主
         chown -R mysql.mysql /目录
     
     进入配置文件添加
         vim /etc/my.cnf
         [mysqld]
         server_id=1
         log-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=1
         log-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: Yes
         Slave_SQL_Running: Yes
     
     第21.22行 表示错误码和错误信息
         Last_Errno: 0
         Last_Error:
     
     第35行    表示主从复制是否有延迟
         Seconds_Behind_Master: 0
有数据
 [主库]
 1.开启bin-log日志
     创建存放bin-log日志目录
         mkdir -p /目录名
     
     修改目录的所属者和所属主
         chown -R mysql.mysql /目录
     
     进入配置文件添加
         vim /etc/my.cnf
         [mysqld]
         server_id=1
         log-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=1
         log-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-bin
         server-id=1
         #打开gtid模式
         gtid_mode=ON
         enforce_gtid_consistency=1  
         重启服务
         systemctl start mysqld
 ​
     [从库]
     vim /etc/my.cnf  #在配置文件中添加配置     
         [mysqld]
         server-id=2
         #打开gtid模式
         gtid_mode=ON
         enforce_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 解压后报的名字 /jdk

2.配置jdk全局变量
	vim /etc/profile/
	添加
	export PATH=/解压的目录/jdk/bin:$PATH

3.生效
	source /etc/profile

4.部署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 | status

6.在真是的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 以后废弃不推荐。
上一篇:5-Django项目--分页与搜索(资产页面)


下一篇:去掉el-table表头右侧类名是gutter,width=17px的空白区域(包括表头样式及表格奇偶行样式和表格自动滚动)