数据库
首页 > 数据库> > JAVA入门基础_从零开始的培训_MYSQL高级

JAVA入门基础_从零开始的培训_MYSQL高级

作者:互联网

目录

第1章 Linux下MySQL的安装与使用

Linux下MYSQL的卸载

rpm -qa | grep -i mysql
# 或
yum list installed | grep mysql
# 方式一
yum remove mysql-xxx mysql-xxx mysql-xxx mysqk-xxxx

# 方式二
rpm -e --nodeps my mysql-xxx mysql-xxx mysqk-xxxx
find / -name mysql  # 查找相关文件
rm -rf xxx          # 删除上述命令查找出的相关文件
rm -rf /etc/my.cnf  # 删除 my.cnf

安装MYSQL之前的准备步骤

# MYSQL8 需要如下安装包
mysql-communiity-client-8.0.25-1.el7.x86_64.rpm
mysql-communiity-client-plugins-8.0.25-1.el7.x86_64.rpm
mysql-communiity-common-8.0.25-1.el7.x86_64.rpm
mysql-communiity-libs-8.0.25-1.el7.x86_64.rpm
mysql-communiity-server-8.0.25-1.el7.x86_64.rpm

# MYSQL5.7 需要如下安装包
# mysql-community-common-5.7.26-1.el7.x86_64.rpm
# mysql-community-libs-5.7.26-1.el7.x86_64.rpm
# mysql-community-client-5.7.26-1.el7.x86_64.rpm
# mysql-community-server-5.7.26-1.el7.x86_64.rpm

正式安装

检查/tmp临时目录权限

  由于mysql安装过程中,会通过mysql用户在/tmp目录下新建tmp_db文件,所以请给/tmp较大的权限。执行该指令:chmod -R 777 /tmp

安装前检查依赖并卸载mariadb

rpm -qa|grep libaio # 检查依赖
rpm -qa|grep net-tools # 检查依赖

#  查询是否有相关的依赖,有则删除
rpm -qa|grep mari
rpm -e --nodeps mariadb-libs # 例如这样一个个卸载
yum remove mysql-libs # 也可以这样卸载

按照顺序依次安装

rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm

MYSQL服务的初始化配置

服务初始化并启动

  为了保证数据库目录与文件的所有者为 mysql 登录用户,如果你是以 root 身份运行 mysql 服务,需要执行下面的命令初始化。
初始化:mysqld --initialize --user=mysql
启动:systemctl start mysqld.service

查看系统生成的默认密码

cat /var/log/mysqld.log

登录到MYSQL设置root用户可以远程登录

mysql -uroot -p输入默认密码  # 登录到MYSQL

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; # 修改ROOT的密码
use mysql; # 使用mysql这个数据库

update mysql set host = '%' where user='root' and host='localhost'; # % 代表任意ip都可以访问

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123'; # MYSQL5不用做该步骤。这里的密码自己定义。

flush privilege; # 刷新权限
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-port=3306/tcp
# 在[mysqld]后面加上
character_set_server=utf8

字符集的相关操作

字符集的级别及默认原则

  提示:当创建数据库时未指定字符集和比较规则时,会默认与服务器级别的字符集、比较规则一致。表级别与数据库级别,列级别再与表级别,以此类推

查看默认的字符集及比较规则

show variables like 'character%';
show variables like 'collation%';

请求到响应过程中字符集的变化

MySQL的数据目录(Linux中的MYSQL)

MySQL8的主要目录结构查询

find / -name mysql

数据库文件的存放路径

/var/lib/mysql/

相关命令目录

/usr/bin(mysqladmin、mysqlbinlog、mysqldump等命令)和/usr/sbin。

配置文件目录

/usr/share/mysql-8.0(命令及配置文件)
/etc/mysql(如my.cnf)

数据库和文件系统的关系

默认数据库的作用

根据不同的存储引擎,数据表文件的表现形式

举例: 数据库a , 表b 。

MYSQL5.7:b.frm、b.idb、db.opt 三个文件
MYSQL8.0:b.idb一个文件


MYSQL5.7:b.frm、b.MYD、b.MYI 三个文件
MYSQL8.0:b.sdi、b.MYD、b.MYI 三个文件

用户和权限管理

登录到MYSQL服务器

mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"

查询用户、创建用户、设置密码、删除用户

# 查询用户
SELECT HOST,USER FROM mysql.user;

# 创建用户,这里的意思是只有192.168.22开头的ip可以连接上,密码为123
CREATE USER 'zhangsan'@'192.168.22.*' IDENTIFIED BY '123';
# 创建一个用户,名字为zhagnsan,任意ip都可以登录,密码123
CREATE USER 'zhangsan'@'%' IDENTIFIED BY '123';

# 设置密码(修改密码)
ALTER USER 'zhangsan'@'192.168.22.*' IDENTIFIED BY '321';

# 删除用户
DROP USER 'zhangsan'@'192.168.22.*';

查询角色、创建角色、删除角色

# 查询角色
SELECT HOST,USER FROM mysql.user; # 注意角色跟用户都在该表当中

# 创建角色
CREATE role 'manager'@'%'; # 创建一个经理角色
CREATE role 'boos'@'%'; # 创建一个boos角色

# 删除角色
DROP role 'manager'@'%';

为用户或角色授予权限、回收权限

# 格式为:GRANT 权限... ON 数据库.数据表 TO  角色;

# 为角色授予权限
GRANT ALL PRIVILEGES ON *.* TO 'boos'@'%';

# 为用户授予权限
GRANT SELECT,UPDATE ON mydb.* TO 'zhangsan'@'%'; # 给予mydb数据库下的所有表的查询和更新权限

# 回收用户的角色。(回收角色时,与其操作一致)
REVOKE SELECT,UPDATE ON mydb.* FROM 'zhangsan'@'%';

将角色赋予给用户,并激活角色

# 将角色授予给用户
GRANT 'boos'@'%' TO 'zhangsan'@'%';

# 激活角色的2种方式
SET DEFAULT ROLE ALL TO 'zhangsan'@'%'; # 为'zhangsan'@'%'用户激活角色
SET GLOBAL activate_all_roles_on_login=ON; # 设置全局激活

# 将角色收回
REVOKE 'boos'@'%' FROM 'zhangsan'@'%';

权限表的层级关系

如下四张权限表中,均有增删改查的权限选项

用户登录时的权限判断

MYSQL的逻辑架构

逻辑架构图(这是5.7的,如果8.0需要去掉查询缓存)

image

Connectors

连接MYSQL服务的一些客户端程序

连接层(第一层)

image

服务层(第二层)

SQL Interface的作用

  1. 接收客户端发送的SQL命令

  2. 返回SQL处理的结果给客户端

Parser解析器的作用

  1. 解析器用于对SQL进行解析

  2. 检查语法、语义,如果检查出错误,直接让SQL Interface返回报错结果

  3. 检查语法、语义,如果检查没有错误,则生成SQL的语法树,交给Optimizer优化器

Optimizer优化器

  1. 对SQL语法树进行逻辑优化(比如说同一个功能换个写法)

  2. 对SQL语法树进行物理优化(更换代码位置等)

Caches & Buffers查询缓存(MYSQL8已弃用)

  1. 查询缓存的存储规则为:key:value,其中的key是SQL语句,value是查询的结果。

  2. 在服务层的SQL Interface接收到了客户端的SQL时,就会进入缓存中查一查,查到就直接返回结果了

弃用原因

引擎层(第三层)

均为可插拔式引擎,真正的负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作。服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同。

存储层

  所有的数据,数据库、表的定义,表的每一行的内容,索引,都是存在 文件系统 上,以 文件 的方式存在的,并完成与存储引擎的交互。

缓冲池(Buffer Pool)

# 设置全局变量
set global innodb_buffer_pool_size = 268435456;

# 修改配置文件
[server]
innodb_buffer_pool_size = 268435456
innodb_buffer_pool_instances = 2 # 缓冲池数量

监控MYSQL指令的执行顺序

查询profiling监控是否开启

select @@profiling;

show variables like 'profiling';

开启监控功能

set profiling=1;

set global profiling=1;

查看所有的profiles;

show profiles;

查看具体的执行计划

show profile;
show profile  for query 1~n;
show profile cpu,block io  for query 1~n;

存储引擎

什么是存储引擎

存储引擎在以前被称之为表处理器,实质上就是存储表的类型

查看和设置MYSQL中的存储引擎

SET DEFAULT_STORAGE_ENGINE=MyISAM;

也可以修改默认文件

default-storage-engine=MyISAM
# 重启服务
systemctl restart mysqld.service

Engine:引擎名称

Support:是否支持使用该存储引擎

Transcations:是否支持事物

XA:是否支持分布式事物
Savepoints:是否支持保存点

InnoDB 引擎:具备外键支持功能的事务存储引擎

MyISAM 引擎:主要的非事务处理存储引擎

InnoDB引擎与MyISAM引擎的区别

索引的数据结构

索引的概述

什么是索引

索引的优点

索引的缺点

常见的索引概念

聚簇(聚集)索引

特点

优点

缺点

非聚簇(聚集)索引 (二级索引 、辅助索引)

首先,如上三个称呼,表明的意思都是一样的。

联合索引

由多个非主键列同时组成。数据页存储联合索引列的数据主键的值

特点

InnoDB的数据结构与MyISAM的数据结构图

image
image

MyISAM 与 InnoDB对比

MyISAM的索引方式都是“非聚簇”的,与InnoDB包含1个聚簇索引是不同的。小结两种引擎中索引的区别:

B+树与B树的区别

image

索引的创建与设计原则

索引的分类

根据逻辑功能划分

根据物理实现方式

根据作用字段个数

索引的创建、删除、查看表的索引

创建索引

创建表的时候创建索引

# 创建普通索引
CREATE TABLE t_1(
  id INT,
  sname VARCHAR(32),
  sno INT,
  age INT,
  intor VARCHAR(64),
  INDEX t_1_sno(sno)
)

# 创建唯一索引
CREATE TABLE t_2(
  id INT,
  sname VARCHAR(32),
  sno INT,
  age INT,
  intor VARCHAR(64),
  UNIQUE INDEX t_1_sname(sname)
)

# 创建主键索引(其实就是指定一个主键)
CREATE TABLE t_3(
  id INT,
  sname VARCHAR(32),
  sno INT,
  age INT,
  intor VARCHAR(64),
  PRIMARY KEY(id)
)

创建表之后添加索引

# 第一种方式
ALTER TABLE t_1 
ADD INDEX t_1_sname(sname);

# 第二种方式
CREATE INDEX t_1_age ON t_1(age);

删除索引

# 第一种方式
ALTER TABLE t_1
DROP INDEX t_1_age;

# 第二种方式
DROP INDEX t_1_sno ON t_1;

查看索引

SHOW INDEX FROM 表名;

JDK8对于索引的新特性

降序索引

# 例如:
CREATE INDEX idx_t_1_age_desc ON t_1(age DESC);

隐藏索引

# 创建一个索引并设置为隐藏
CREATE INDEX idx_t_1_sname ON t_1(sname) invisible;

# 将一个已有的索引设置为隐藏
ALTER TABLE t_1
ALTER INDEX idx_t_1_sname visible;

使隐藏索引对查询优化器可见(了解)

select @@optimizer_switch;
set session optimizer_switch="use_invisible_indexes=on";
use_invisible_indexes=off

索引的设计原则

哪些情况适合创建索引

哪些情况不适合创建索引

性能分析工具的使用

数据库服务器的优化步骤

整体思路: 先观察、再行动

查看系统性能参数

SHOW [GLOBAL|SESSION] STATUS LIKE '参数';

一些常用的性能参数如下:

比较查询开销last_query_cost

定位执行慢的SQL:慢日志查询

开启和查看

查看慢查询数量

SHOW STATUS LIKE '%Slow_queries%'

修改及查看慢查询阈值

慢查询分析工具 mysqldumpslow,注意不是在mysql当中使用

mysqldumpslow的常用参数

常用的工作参考

#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 慢查询日志文件路径

#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 慢查询日志文件路径

#得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" 慢查询日志文件路径

#另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 慢查询日志文件路径 | more

关闭慢查询日志

[mysqld]
slow_query_log=OFF

或者

[mysqld]
#slow_query_log =OFF
SET GLOBAL slow_query_log=off;

删除、重建慢查询日志

查看SQL执行成本(资源消耗信息) SHOW PROFILE

介绍:该功能开启后,可以监控每一条SQL指令,查看SQL的执行成本。

开启该功能

# 查看功能是否开启
SHOW VARIABLES LIKE '%profiling%';

# 开启该功能(这里仅开启session当前会话)
SET profiling = 1;

查询SQL的执行成本

# 查询监控到的SQL,该命令可以看到一个字段叫做Query_ID
SHOW PROFILES;

# 通过Query_ID查询指定SQL的执行成本,例如Query_ID = 37
SHOW PROFILE FOR QUERY 37;

image

PROFILE常见参数

分析查询语句EXPLAIN(常用)

版本情况(了解)

基本语法及各个列的作用

EXPLAIN 后接SQL语句即可

table列

  不论我们的查询语句有多复杂,里边儿 包含了多少个表 ,到最后也是需要对每个表进行 单表访问 的,所以MySQL规定EXPLAIN语句输出的每条记录都对应着某个单表的访问方法,该条记录的table列代表着该表的表名(有时不是真实的表名字,可能是简称)。

id列,

select_type列

查询类型。
image
image

partitions (可略)

type(重要)

完整的访问方法如下:按照常理来说越往后效率越低。

possible_key 和 key

ken_len(重要)

ref

rows(重要)、filtered

Extra(重要)

EXPLAIN四种输出格式

# 传统格式
 EXPLAIN
 
# JSON格式
EXPLAIN FORMAT=JSON 

# Tree格式
EXPLAIN FORMAT=tree

# 可视化格式
可以通过MySQL Workbench可视化查看MySQL的执行计划

EXPLAIN小结

SHOW WARNINGS(查看优化器优化后的SQL语句)

分析优化器执行计划:trace

# 设置trace开启,并指定格式为JSON
SET optimizer_trace="enabled=on",end_markers_in_json=on;

# 设置trace最大能够使用的内存大小,避免因内存过小不能够完整展示
set optimizer_trace_max_mem_size=1000000;

MySQL监控分析视图-sys schema

视图摘要

  1. 主机相关:以host_summary开头,主要汇总了IO延迟的信息。

  2. Innodb相关:以innodb开头,汇总了innodb buffer信息和事务等待innodb锁的信息。

  3. I/o相关:以io开头,汇总了等待I/O、I/O使用量情况。

  4. 内存使用情况:以memory开头,从主机、线程、事件等角度展示内存的使用情况

  5. 连接与会话信息:processlist和session相关视图,总结了会话相关信息。

  6. 表相关:以schema_table开头的视图,展示了表的统计信息。

  7. 索引信息:统计了索引的使用情况,包含冗余索引和未使用的索引情况。

  8. 语句相关:以statement开头,包含执行全表扫描、使用临时表、排序等的语句信息。

  9. 用户相关:以user开头的视图,统计了用户使用的文件I/O、执行语句统计信息。

  10. 等待事件相关信息:以wait开头,展示等待事件的延迟情况。

索引情况

#1. 查询冗余索引
select * from sys.schema_redundant_indexes;

#2. 查询未使用过的索引
select * from sys.schema_unused_indexes;

#3. 查询索引的使用情况
select index_name,rows_selected,rows_inserted,rows_updated,rows_deleted from sys.schema_index_statistics where table_schema='dbname' ;

表相关

# 1. 查询表的访问量
select table_schema,table_name,sum(io_read_requests+io_write_requests) as io from sys.schema_table_statistics group by table_schema,table_name order by io desc;

# 2. 查询占用bufferpool较多的表
select object_schema,object_name,allocated,data
from sys.innodb_buffer_stats_by_table order by allocated limit 10;

# 3. 查看表的全表扫描情况
select * from sys.statements_with_full_table_scans where db='dbname';

语句相关

#1. 监控SQL执行的频率
select db,exec_count,query from sys.statement_analysis
order by exec_count desc;

#2. 监控使用了排序的SQL
select db,exec_count,first_seen,last_seen,query
from sys.statements_with_sorting limit 1;

#3. 监控使用了临时表或者磁盘临时表的SQL
select db,exec_count,tmp_tables,tmp_disk_tables,query
from sys.statement_analysis where tmp_tables>0 or tmp_disk_tables >0 order by (tmp_tables+tmp_disk_tables) desc;

IO相关

#1. 查看消耗磁盘IO的文件
select file,avg_read,avg_write,avg_read+avg_write as avg_io
from sys.io_global_by_file_by_bytes order by avg_read limit 10;

Innodb 相关

#1. 行锁阻塞情况
select * from sys.innodb_lock_waits;

10、索引优化及查询优化

索引可能失效的原因

关联查询优化

  1. 为被驱动表的等值比较列添加索引

  2. 为where条件中的字段添加索引

JOIN的分类及原理

分类

原理(Hash略过)

外连接与内连接,驱动表与被驱动表由谁决定?

由优化器进行确认。

参数配置

# 查看block_nested_loop是否开启
show variables like '%optimizer_switch%'

# 驱动表能不能被一次性加载完,要看join buffer能不能存储下所有驱动表的数据。默认大小为256k,Windows以及32位的操作系统最多申请4G,64位的Linux可以申请4G以上
show variables like '%join_buffer%;'

子查询优化和排序优化

子查询优化

排序优化

  1. SQL 中,可以在 WHERE 子句和 ORDER BY 子句中使用索引,目的是在 WHERE 子句中 避免全表扫描 ,在 ORDER BY 子句 避免使用 FileSort 排序 。当然,某些情况下全表扫描,或者 FileSort 排序不一定比索引慢。但总的来说,我们还是要避免,以提高查询效率。

  2. 尽量使用 Index 完成 ORDER BY 排序。如果 WHERE 和 ORDER BY 后面是相同的列就使用单索引列;如果不同就使用联合索引。

  3. 无法使用 Index 时,需要对 FileSort 方式进行调优。

  4. 当【范围条件】和【group by 或者 order by】的字段出现二选一时,优先观察条件字段的过滤数量,如果过滤的数据足够多,而需要排序的数据并不多时,优先把索引放在范围字段上。反之,亦然。

排序的算法以及参数配置

Group by优化

Limit分页查询

覆盖索引及索引下推ICP

覆盖索引

索引下推

其他查询优化策略

Exists与IN的使用

前提: A表大于B表

COUNT(*)与COUNT(1)、COUNT(字段)的区别

主键应该如何设计

经常做COMMIT操作

MYSQL中的事务

事务是一组逻辑操作单元,使数据从一种状态变换到另一种状态。

事务的ACID特性与事务的状态

ACID特性

事物的状态

显式事务与隐式事务

显式事务

# 格式1
begin

commit/rollback

# 格式2,中括号中3个选项分别为只读,读写、启动一致性读
start transaction [READ ONLY |  READ WRITE |  WITH CONSISTENT SNAPSHOT]


commit/rollback

隐式事务

# 将自动提交关闭
SET autocommit = OFF;

commit/rollback;

保存点的使用

# 设置保存点,任意取个名
SAVEPOINT aaa;

# 回滚到保存点处,注意:这个时候事务并没有关闭。
ROLLBACK TO aaa;

事务的4种隔离级别

隔离级别的查看与设置

# 例如设置为读已提交,注意,该变量也可以设置为global全局
set transaction_isolation = 'READ-COMMITTED';

# 如果需要永久生效,需要修改配置文件
[mysqld]
transaction-isolation = READ-COMMITTED

Redo重做日志与binlog日志

  1. redo日志的好处

    • redo日志降低了刷盘频率
    • redo日志占用的空间非常小
  2. redo日志的特点

    • redo日志是顺序写入磁盘的
    • 事务执行过程中,redo log不断记录
      image

Mini-Transaction,简称mtr

write pos 和 checkpoint

Redo重做日志的相关配置

Updo回滚/撤销日志

undo log是逻辑日志,对事务回滚时,只是将数据库逻辑地恢复到原来的样子。已经开辟的updo 页并不会删除,仅仅是从逻辑上删除了而已。

Updo的存储结构

回滚段中的数据分类

  1. 未提交的回滚数据(uncommitted undo information)

  2. 已经提交但未过期的回滚数据(committed undo information)

    • 考虑为一个updo页,可能不仅仅是一个事务在使用,因此不能马上清理
  3. 事务已经提交并过期的数据(expired undo information)

updo日志对于增删改的记录规则

锁的概述

锁的分类

按照数据的操作类型划分

锁颗粒度划分

对待锁的态度划分

加锁方式

其他

锁的内存结构

锁监控常用指令

查看行锁的争夺情况

show status like 'innodb_row_lock%';

查询正在被锁阻塞的sql语句

SELECT * FROM information_schema.INNODB_TRX\G;

查询锁阻塞情况

SELECT * FROM data_lock_waits\G;

查询锁的情况

SELECT * from performance_schema.data_locks\G;

MVCC多版本并发控制(乐观锁)

MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版
本管理来实现数据库的 并发控制 。这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操作有了保
证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样
在做查询的时候就不用等待另一个事务释放锁。

组成的核心

适用的隔离级别

仅在读已提交和可重复读这两个隔离级别上有效。

快照读与当前读

行格式额外字段复习

ReadView

其他数据库日志(除了binlog日志,其他都是文本文件)

通用查询日志

错误日志

二进制日志

查看二进制日志系统变量信息show variables like '%log_bin%';

image

建立一个新的binlog日志flush logs

binlog日志文件的常用配置


# 启用二进制日志,指名路径。比如:自己本地的路径/log/mysql-bin
log-bin=/log/mysql-bin

# 设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds=6000

# 控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=200M

# 设置不要复制的数据库
binlog-ignore-db=test

# 设置需要复制的数据库,默认全部记录。多个数据库的话,该配置可以写多次比如:binlog-do-db=codestarts_master_slave
binlog-do-db=需要复制的主数据库名字

# 设置binlog格式
binlog_format=STATEMENT

binlog_format的3个参数

binlog的写入过程

sync_binlog参数配置

binlog 与 redo log的对比

二阶段提交

数据查看与数据恢复

查看bin日志的2种方式
# -v 以伪sql的方式展示出来
mysqlbinlog -v  binlog日志文件路径
show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

# IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
# FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
# LIMIT [offset] :偏移量(不指定就是0)
# row_count :查询总条数(不指定就是所有行)

例如:show binlog events in 'codestarts-bin.000003';
使用binlog恢复数据的2种方式
# 注意开始的定位、结束的定位、数据库名、binlog文件名、用户名密码、以及-v后面的数据库名
/usr/bin/mysqlbinlog --start-position=? --stop-position=? --database=? /var/lib/mysql/binlog/codestarts-bin.000003 | /usr/bin/mysql -uroot -p? -v 数据库名

/usr/bin/mysqlbinlog --start-position= --stop-position=? --database=? /var/lib/mysql/binlog/codestarts-bin.000003 | /usr/bin/mysql -uroot -p? -v 数据库名
insert into table1 values(10,'lisi');
insert into table1 values(11,'lisi');
insert into table1 values(12,'lisi');

delete from table1 where id > 9;
/usr/bin/mysqlbinlog --start-position=219 --stop-position=1014 --database=mydb /var/lib/mysql/codestarts-bin.000003 | /usr/bin/mysql -uroot -pabc123 -v mydb

删除 binlog日志文件

提示:恢复文件时,如果需要恢复文件1和文件2,而文件2是在文件1之后生成的,那么则需要先恢复文件1

中继日志

数据定义语句日志(元数据日志)

主从复制

主从复制的原理

准备工作

准备2台Centos虚拟机

可以选择关闭防火墙或者开放端口

# 1.关闭防火墙
systemctl stop firewalld.service;

# 2. 开放端口
firewall-cmd --permanent --add-port=3306/tcp;
firewall-cmd --reload;

主机配置文件

[mysqld]
#启用二进制日志
# 为每个mysql服务器配置的id
server-id=1
# binlog日志的前缀
log-bin=codestarts-bin
#[可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=0
# 设置日志文件保留的时长,单位是秒,注意:MYSQL8才支持的
# binlog_expire_logs_seconds=6000
##控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=200M
##[可选]设置不要复制的数据库
binlog-ignore-db=test
##[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=atguigu_master_slave
binlog-do-db=codestarts_db
##[可选]设置binlog格式
binlog_format=STATEMENT

从机配置文件

[mysqld]
#[必须]从服务器唯一ID
server-id=2
#[可选]启用中继日志
relay-log=mysql-relay

#[可选] 0(默认)表示读写(主机),1表示只读(从机)
read-only=1

主机:使用主机建立账户并授权

#在主机MySQL里执行授权主从复制的命令
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'从机器数据库IP' IDENTIFIED BY 'abc123';

# 例如
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%' IDENTIFIED BY '123123';

CREATE USER 'slave1'@'%' IDENTIFIED BY '123123';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';

#此语句必须执行。否则见下面。
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
flush privileges;

主机:查看主机的状态并记录下File和status的值

show master status;
image

从机:配置需要复制的主机

CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;


CHANGE MASTER TO MASTER_HOST='192.168.22.22',MASTER_USER='slave1',MASTER_PASSWORD='123123',MASTER_LOG_FILE='codestarts-bin.000005',MASTER_LOG_POS=154;

常用命令

使用mysqldump备份、恢复数据库(逻辑备份)

备份数据库

备份单个数据库

mysqldump -uroot -pabc123 db_dump_test>db_dump_test.sql

备份所有数据库

#  使用--all-databases或者-A参数
mysqldump -uroot -pabc123 --all-databases >all_databases.sql

备份部分数据库

mysqldump –u user –h host –p --databases [数据库的名称1 [数据库的名称2...]] > 备份文件名
称.sql

备份部分表

mysqldump –u user –h host –p 数据库的名称 [表名1 [表名2...]] > 备份文件名称.sql

# 例如备份多张表
mysqldump -uroot -p db_dump_test book studetn > multi_tables.sql

备份单表的部分数据

# 备份student表中id小于10的数据
mysqldump -uroot -p db_dump_test student --where="id < 10 " > student_part_id_low10.sql

备份时排除某些表

mysqldump -uroot -p db_dump_test --ignore-table=db_dump_test.student > no_stu_bak.sql

只备份结构或只备份数据

# 只备份结构:没有数据
mysqldump -uroot -p db_dump_test --no-data > db_no_data_bak.sql

# 只备份数据:没有结构
mysqldump -uroot -p db_dump_test --no-create-info > db_no_create_info_bak.sql

备份中包含存储过程、函数、事件

# 可以使用 --routines 或 -R 选项来备份存储过程及函数,使用 --events 或 -E 参数来备份事件。
mysqldump -uroot -p -R -E --databases db_dump_test > fun_db_bak.sql

mysqldump常用选项

--add-drop-database:在每个CREATE DATABASE语句前添加DROP DATABASE语句。
--add-drop-tables:在每个CREATE TABLE语句前添加DROP TABLE语句。
--add-locking:用LOCK TABLES和UNLOCK TABLES语句引用每个表转储。重载转储文件时插入得更快。
--all-database, -A:转储所有数据库中的所有表。与使用--database选项相同,在命令行中命名所有数据库。
--comment[=0|1]:如果设置为0,禁止转储文件中的其他信息,例如程序版本、服务器版本和主机。--skipcomments与--comments=0的结果相同。默认值为1,即包括额外信息。
--compact:产生少量输出。该选项禁用注释并启用--skip-add-drop-tables、--no-set-names、--skipdisable-keys和--skip-add-locking选项。
--compatible=name:产生与其他数据库系统或旧的MySQL服务器更兼容的输出,值可以为ansi、MySQL323、
MySQL40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_table_options或者
no_field_options。
--complete_insert, -c:使用包括列名的完整的INSERT语句。
--debug[=debug_options], -#[debug_options]:写调试日志。
运行帮助命令 mysqldump --help ,可以获得特定版本的完整选项列表。
提示 如果运行mysqldump没有--quick或--opt选项,mysqldump在转储结果前将整个结果集装入内
存。如果转储大数据库可能会出现问题,该选项默认启用,但可以用--skip-opt禁用。如果使用最
新版本的mysqldump程序备份数据,并用于恢复到比较旧版本的MySQL服务器中,则不要使用--opt
或-e选项。
--delete,-D:导入文本文件前清空表。
--default-character-set=charset:使用charsets默认字符集。如果没有指定,就使用utf8。
--delete--master-logs:在主复制服务器上,完成转储操作后删除二进制日志。该选项自动启用-masterdata。
--extended-insert,-e:使用包括几个VALUES列表的多行INSERT语法。这样使得转储文件更小,重载文件时可
以加速插入。
--flush-logs,-F:开始转储前刷新MySQL服务器日志文件。该选项要求RELOAD权限。
--force,-f:在表转储过程中,即使出现SQL错误也继续。
--lock-all-tables,-x:对所有数据库中的所有表加锁。在整体转储过程中通过全局锁定来实现。该选项自动关
闭--single-transaction和--lock-tables。
--lock-tables,-l:开始转储前锁定所有表。用READ LOCAL锁定表以允许并行插入MyISAM表。对于事务表(例
如InnoDB和BDB),--single-transaction是一个更好的选项,因为它根本不需要锁定表。
--no-create-db,-n:该选项禁用CREATE DATABASE /*!32312 IF NOT EXIST*/db_name语句,如果给出-
-database或--all-database选项,就包含到输出中。
--no-create-info,-t:只导出数据,而不添加CREATE TABLE语句。
--no-data,-d:不写表的任何行信息,只转储表的结构。
--opt:该选项是速记,它可以快速进行转储操作并产生一个能很快装入MySQL服务器的转储文件。该选项默认开启,
但可以用--skip-opt禁用。
--password[=password],-p[password]:当连接服务器时使用的密码。
-port=port_num,-P port_num:用于连接的TCP/IP端口号。
--protocol={TCP|SOCKET|PIPE|MEMORY}:使用的连接协议。
--replace,-r –replace和--ignore:控制替换或复制唯一键值已有记录的输入记录的处理。如果指定--
replace,新行替换有相同的唯一键值的已有行;如果指定--ignore,复制已有的唯一键值的输入行被跳过。如果不
指定这两个选项,当发现一个复制键值时会出现一个错误,并且忽视文本文件的剩余部分。
--silent,-s:沉默模式。只有出现错误时才输出。
--socket=path,-S path:当连接localhost时使用的套接字文件(为默认主机)。
--user=user_name,-u user_name:当连接服务器时MySQL使用的用户名。
--verbose,-v:冗长模式,打印出程序操作的详细信息。
--xml,-X:产生XML输出。

MYSQL命令恢复数据

单库备份中恢复单库

# 如果备份文件中包含了创建数据库的语句,则恢复的时候不需要指定数据库名称
mysql -uroot -p < mydb.sql

# 如果不包含,则需要自己创建数据库后
mysql -uroot -p mydb< mydb.sql

全量备份恢复

mysql –u root –p < all.sql

从全量备份中恢复单库

# 从全量备份中将单个数据库的信息抽取出来
sed -n '/^-- Current Database: `db_dump_test`/,/^-- Current Database: `/p' all_database.sql> db_dump_test.sql

# 这个时候就只需要执行恢复单库命令即可
mysql -uroot -p  < db_dump_test.sql

从单库备份中恢复单表

# 获取单表的结构,例如这里是从db_dump_test.sql这个数据库备份中获取student表的结构
cat db_dump_test.sql | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `student`/!d;q' >student_structure.sql

# 获取单表的数据
cat db_dump_test.sql | grep --ignore-case 'insert into `student`' > student_data.sql

# 接下来只需要把如上2个生成的SQL都在MYSQL命令行执行(注意路径问题)
source student_structure.sql;
source student_data.sql;

表的导入与导出

使用SELECT…INTO OUTFILE导出文本文件(MYSQL内)

使用mysqldump命令导出文本文件

使用mysqldump导出表,要求字段之间使用逗号“,”间隔,所有字符类型字段值用双引号括起来

mysqldump -uroot -p -T "/var/lib/mysql-files/" db_dump account --fields-terminatedby=',' --fields-optionally-enclosed-by='\"'

使用mysql命令导出文本文件

- 使用mysql语句导出db_dump数据中account表中的记录到文本文件
mysql -uroot -p --execute="SELECT * FROM account;" db_dump>"/var/lib/mysqlfiles/account.txt"

- 将db_dump数据库account表中的记录导出到文本文件,使用--veritcal参数将该条件记录分为多行显示
mysql -uroot -p --vertical --execute="SELECT * FROM account;" db_dump >"/var/lib/mysql-files/account_1.txt"

- 将db_dump数据库account表中的记录导出到xml文件,使用--xml参数
mysql -uroot -p --xml --execute="SELECT * FROM account;" db_dump>"/var/lib/mysqlfiles/account_3.xml"

- 如果要将表数据导出到html文件中,可以使用 --html 选项。然后可以使用浏览器打开。

使用LOAD DATA INFILE方式导入文本文件

不同格式的文本数据

# 先导出点数据
SELECT * FROM db_dump.account INTO OUTFILE '/var/lib/mysql-files/account_0.txt';

# 删除account表中的数据
DELETE FROM db_dump.account;

# 导入数据
LOAD DATA INFILE '/var/lib/mysql-files/account_0.txt' INTO TABLE db_dump.account;

字段之间有分隔符,所有字段有双引号括起来

# 使用SELECT…INTO OUTFILE将db_dump数据库account表中的记录导出到文本文件,使用FIELDS选项和LINES选项,要求字段之间使用逗号","间隔,所有字段值用双引号括起来
SELECT * FROM db_dump.account INTO OUTFILE '/var/lib/mysql-files/account_1.txt' FIELDS
TERMINATED BY ',' ENCLOSED BY '\"';

# 删除account表中的数据
DELETE FROM db_dump.account;

# 从/var/lib/mysql-files/account.txt中导入数据到account表中
LOAD DATA INFILE '/var/lib/mysql-files/account_1.txt' INTO TABLE atguigu.account FIELDS TERMINATED BY ',' ENCLOSED BY '\"';

使用mysqlimport方式导入文本文件

# 导出文件account.txt,字段之间使用逗号","间隔,字段值用双引号括起来
SELECT * FROM db_dump.account INTO OUTFILE '/var/lib/mysql-files/account.txt' FIELDS
TERMINATED BY ',' ENCLOSED BY '\"';

# 删除表中数据
DELETE FROM db_dump.account;

# 使用mysqlimport命令将account.txt文件内容导入到数据库db_dump的account表
mysqlimport -uroot -p db_dump '/var/lib/mysql-files/account.txt' --fields-terminated by=',' --fields-optionally-enclosed-by='\"

标签:binlog,JAVA,--,mysql,查询,索引,从零开始,MYSQL,日志
来源: https://www.cnblogs.com/itdqx/p/16598338.html