[MySQL最详细的知识点]

news2024/11/17 21:52:10

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 以后废弃不推荐。

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

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

相关文章

自动化测试-ddt数据驱动yaml文件实战(详细)

前言 ddt 驱动 yaml/yml 文件来实现数据驱动测试 ddt.file_data&#xff1a;装饰测试方法&#xff0c;参数是文件名。文件可以是 json 或者 yaml 类型。 注意&#xff1a;如果文件是以 “.yml”或者".yaml" 结尾&#xff0c;ddt 会作为 yaml 类型处理&#xff0c;…

【教学类-59-01】专注力视觉训练01(圆点百数图)

背景需求&#xff1a; 视觉训练的神奇效果&#xff0c;让你的宝贝成为焦点 - 小红书魔法视觉追踪-视觉训练—— &#x1f50d;视觉训练&#x1f50d; &#x1f539;想要提高宝宝的专注力&#xff0c;视觉训练是个绝佳方法&#xff01; &#x1f539;让宝宝仔细观察数字的路线&a…

JavaScript-内存分配,关键字const

内存空间 内存分为栈和堆 栈&#xff1a;由操作系统自动释放存放的变量值和函数值等。简单数据类型存放在栈中 栈会由低到高先入后出 堆&#xff1a;存储引用类型 &#xff08;数组&#xff0c;对象&#xff09; 对象会先将数据存放在堆里面&#xff0c;堆的地址放在栈里面 关键…

喜讯 | 盘古信息冠捷科技、锐明科技IMS项目荣获创新案例、优秀案例

5月28日&#xff0c;中国数据要素及行业应用创新大会盛大启幕&#xff0c;现场汇聚了中国工程院院士、数据要素研究机构及数据要素知名企业、数字要素行业生态代表等300位业内相关人士。广东盘古信息科技股份有限公司副总经理朱熀锋代表盘古信息出席大会&#xff0c;并带来了IM…

Sytem.getenv的作用和意义介绍

Sytem.getenv的作用和意义介绍&#xff01;在实际的项目开发中&#xff0c;我们经常需要获取一些系统自身的环境变量&#xff0c;为此&#xff0c;java官方提供的这个系统环境变量&#xff0c;自带了一个方法&#xff0c;就可以直接拿到系统的环境变量值了。 下面是一个简单的…

誉天Linux云计算架构师就业班要学习哪些内容?

课程设计思路&#xff1a; 根据十多年来毕业学员的就业和反馈&#xff0c;对数百名学员的就业回访;Linux运维&#xff0c;云计算&#xff0c;高并发&#xff0c;分布式&#xff0c;容器&#xff0c;云原生&#xff0c;自动化等是目前市场上就业情况最好&#xff0c;需求量最大&…

vue项目集成萤石云在Web系统中实现实时摄像头监控及控制功能

需求 需求&#xff1a; 开发人员在产线上放置一个萤石摄像头&#xff0c;前端在可视化大屏上实时监控&#xff0c;且控制左右上下功能。 效果 萤石云接入web前期准备工作 阅读萤石云API文档&#xff1a;萤石云开放平台开发者文档 阅读萤石云控制API文档&#xff1a;萤石云摄…

CATIA二次开发VBA入门(4)——进程外开发环境搭建,vb.net在Visual Studio中开发,创建圆柱曲面的宏录制到二次开发案例

目录 引出vb.net和vb6.0 进程外开发环境搭建vb.net开发环境搭建《CATIA二次开发技术基础》模板 添加宏库引用 vs开发环境初步vs中的立即窗口对象浏览器 建立模板案例&#xff1a;创建一堆圆柱曲面第一步&#xff1a;录制宏第二步&#xff1a;代码精简第三步&#xff1a;for循环…

Aloha机械臂的mujoco仿真问题记录

今天在测试ACT代码时&#xff0c;遇到了仿真中的机械臂无法摆放正确的姿势来抓去红色方块。 后来经过测试&#xff0c;发现应该是python包的版本问题有误&#xff0c;下面记录下正确的包版本&#xff1a; 官方给出的包&#xff1a; conda create -n aloha python3.8.10 conda…

YOLOv8 简介

YOLOv8 是 YOLO 系列的最新版本&#xff0c;在 2023 年由 Ultralytics&#xff08;YOLO 的创造者&#xff09;发布&#xff0c;是性能最佳的目标检测器之一&#xff0c;被视为对现有 YOLO 变体&#xff08;如 YOLO v5 和 YOLOX&#xff09;的改进。 YOLOv8 支持全方位的视觉 A…

【C++】前缀和:一维前缀和

1.题目 2.算法思路 如果暴力求解的话&#xff0c;时间复杂度为O(n*q)。一定会超时。 优化的思路也很简单&#xff0c;就是得到一个求和数组arr&#xff0c;使arr[i]a1a2...ai。 然后每次求l到r之间的数时&#xff0c;直接arr[r]-arr[l-1]就可以得出&#xff01; 这样&#…

贷款借钱平台 小额贷款系统开发小额贷款源码 贷款平台开发搭建

这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码51800 数据库替换application/database.php程序采用PHPMySQL&#xff0c;thinkphp框架代码开源&#xff0c;不加密后台效果&#xff1a;手机版效果 这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码…

CEEMDAN +组合预测模型(CNN-Transfromer + XGBoost)

注意&#xff1a;本模型继续加入 组合预测模型全家桶 中&#xff0c;之前购买的同学请及时更新下载! 往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;Transformer-BiGRU预测模…

coveralls使用pytest进行本地测试时报错SyntaxError: invalid escape sequence \S

## 错误复现&#xff1a; git clone gitgithub.com:TheKevJames/coveralls-python.git cd coveralls-python poetry install poetry run pytest## 错误内容&#xff1a; ## 完整的打印信息 test session starts platform darwin -- Python 3.8.18, pytest-8.2.1, pluggy-1.5.…

【机器学习300问】104、残差网络是怎么起作用的?

残差网络&#xff08;Residual Network&#xff0c;简称ResNet&#xff09;诞生是为了解决深度神经网络的训练困难性问题。深度神经网络在图像分类等任务上取得了重大突破&#xff0c;但随着网络层数的增加&#xff0c;训练变得更加困难。 一、神经网络深度过深会出现…

与AI对话 --如何更好的使用AI工具

文章目录 与AI对话 --如何更好的使用AI工具1、认识AI工具&#xff1a;2、对话原则&#xff1a;3、提问步骤&#xff1a;4、AI可以学习什么&#xff1f;5、提问技巧&#xff1a;1、提出假设性问题:2、&#xff08;鼓励引导式提问&#xff09;跨学科思考:举个例子&#xff1a; 3、…

在Android中解析XML文件并在RecyclerView中显示

1. 引言 最近工作有解析外部xml文件在App中显示的需求&#xff0c;特来写篇文章记录一下&#xff0c;方便下次使用。 2. 准备工作 首先&#xff0c;在项目的AndroidManifest.xml文件中添加读取外部存储的权限声明。 <uses-permission android:name"android.permiss…

社交媒体数据恢复:百度贴吧

一、准备工作 请先确保您已登录百度账号&#xff0c;并熟悉百度贴吧的基本操作。 二、找回被系统删除的帖子 进入“我的”页面&#xff1a;在百度贴吧主页中&#xff0c;点击右下角的“我的”。 进入“我的帖子”页面&#xff1a;在个人中心页面中&#xff0c;点击“我的帖子…

生态农业:引领未来农业新篇章

生态农业&#xff0c;正以其独特的魅力和创新理念&#xff0c;引领着未来农业发展的新篇章。在这个充满变革的时代&#xff0c;我们需要更加关注农业的可持续发展&#xff0c;而生态农业正是实现这一目标的重要途径。 生态农业产业的王总说&#xff1a;生态农业强调生态平衡和可…

图形学初识--空间变换

文章目录 前言正文矩阵和向量相乘二维变换1、缩放2、旋转3、平移4、齐次坐标下总结 三维变换1、缩放2、平移3、旋转绕X轴旋转&#xff1a;绕Z轴旋转&#xff1a;绕Y轴旋转&#xff1a; 结尾&#xff1a;喜欢的小伙伴可以点点关注赞哦 前言 前面章节补充了一下基本的线性代数中…