Skip to content

Commit

Permalink
Liunx笔记
Browse files Browse the repository at this point in the history
  • Loading branch information
PlutoaCharon committed May 8, 2020
1 parent 9f47590 commit 5c598fc
Show file tree
Hide file tree
Showing 8 changed files with 398 additions and 2 deletions.
Binary file added Images/image-20200508093831919.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Images/image-20200508101335190.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Images/image-20200508102608780.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
101 changes: 101 additions & 0 deletions Liunx面试笔记/数据库/Mysql主从复制.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
## Mysql集群相关

### 主从复制

![image-20200508093831919](../../Images/image-20200508093831919.png)

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;

主数据库一般是准实时的业务数据库

#### 主从复制的作用

1. 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2. 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3. 读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
4. 备份,避免影响业务



#### 主从复制的原理

1.数据库有个bin-log二进制文件,记录了所有sql语句。

2.从数据库把主数据库的bin-log文件的sql语句复制过来。

3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。

具体需要==三个线程==来操作:

1. binlog输出线程。每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。

在从库里,当复制开始的时候,从库就会创建两个线程进行处理:

2. 从库I/O线程。当`START SLAVE`语句在从库开始执行之后,从库创建一个 I/O Thread ,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。(如果该线程追赶上了主库,会进入睡眠状态)从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。

3. 从库的SQL线程。从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。

可以知道,对于每一个主从复制的连接,都有三个线程。

#### 具体过程

![image-20200508101335190](../../Images/image-20200508101335190.png)

拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。

1. slave 服务器执行 start slave,开启主从复制开关,slave 服务器的 I/O Thread 请求从 master 服务器读取 binlog(如果该线程追赶上了主库,会进入睡眠状态)

2. master 服务器创建 Log Dump Thread,把 binlog 发送给 slave 服务器。slave 服务器的 I/O Thread 将读取到的 binlog 日志内容写入中继日志 relay log(中继日志,mysql-relay-bin.xxxxxx,会记录位置信息,以便下次继续读取)

3. slave 服务器的 SQL Thread 会实时监测 relay log 新增的日志内容,Exec_Master_Log_Pos位置开始执行读取到的更新事件,并解析成 SQL 语句,并执行,以此实现主从的操作一致,而最终数据一致;

### 主从复制存在的问题

在高并发场景下,从库的数据一定会比主库慢一些,是**有延时**的。所以经常出现,刚写入主库的数据可能是读不到的,要过几十毫秒,甚至几百毫秒才能读取到。

- 主库宕机后,数据可能丢失
- 从库只有一个sql Thread,主库写压力大,复制很可能延时

解决方法:

- 半同步复制—解决数据丢失的问题
- 并行复制—-解决从库复制延迟的问题

#### 半同步复制

**mysql semi-sync(半同步复制)**

半同步复制:

- 5.5集成到mysql,以插件的形式存在,需要单独安装
- 确保事务提交后binlog至少传输到一个从库
- 不保证从库应用完这个事务的binlog
- 性能有一定的降低,响应时间会更长
- 网络异常或从库宕机,卡主主库,直到超时或从库恢复

##### 半同步复制原理

5.5之前,MySQL的复制其实是异步操作,而不是同步

- 事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端
- 5.5集成到mysql,以插件的形式存在,需要单独安装
- 确保事务提交后binlog至少传输到一个从库
- 不保证从库应用完成这个事务的binlog
- 性能有一定的降低
- 网络异常或从库宕机,卡主库,直到超时或从库恢复


![image-20200508102608780](../../Images/image-20200508102608780.png)

#### 并行复制

mysql并行复制

- 社区版5.6中新增
- 并行是指从库多线程apply binlog库级别并行应用binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组)设置
- 设置sql线程数为10 `set global slave_parallel_workers=10;`


### 复制出错处理

常见:1062(主键冲突),1032(记录不存在)
56 changes: 56 additions & 0 deletions Liunx面试笔记/数据库/Mysql索引.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
## Mysql索引

### 什么是索引

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。



### 索引有哪些优缺点?

#### 索引的优点

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

#### 索引的缺点

时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;

空间方面:索引需要占物理空间。



### 索引的分类

- 主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
- 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
- 可以通过`ALTER TABLE table_name ADD UNIQUE (column);`创建唯一索引
- 可以通过 `ALTER TABLE table_name ADD UNIQUE (column1,column2);` 创建唯一组合索引

- 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
- 可以通过`ALTER TABLE table_name ADD INDEX index_name (column);`创建普通索引
- 可以通过`ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);`创建组合索引

- 全文索引: 是目前搜索引擎使用的一种关键技术。
- 可以通过`ALTER TABLE table_name ADD FULLTEXT (column);`创建全文索引





### 误操作drop语句导致数据库数据破坏,请给出恢复的实际大体步骤

```
手动切割binlog日志并记好切割好的binlog日志文件位置,这里假设为009,备份全部binlog日志
找到之前全备数据最后备份到的binlog文件位置并记好位置,这里假设为005
用mysqladmin命令将005到008binlog文件中的SQL语句分离出来,并找到drop库的语句将其删掉
将之前全备数据导入mysql服务器
将步骤3中分离出的SQL语句导入mysql服务器
将009binlog文件删除,再次刷新binlog日志,到此数据库已恢复成功
```

42 changes: 42 additions & 0 deletions Liunx面试笔记/数据库/Redis.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
## Redis

### Redis工作原理

Redis是一个key-value存储系统,它支持的value类型相对较多,包括string、list、set和zset,这些数据都支持push/pop/add/remove及交并补等操作,而且这些操作都是原子性的,在此基础上,redis支持各种不同方式的排序。

为了保证效率,数据是缓存在内存中的,Redis会周期性的把数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave同步

### Redis持久化-RDB

在Redis运行时,RDB程序将当前内存中的数据库快照保存到磁盘中,当Redis需要重启时,RDB程序会通过重载RDB文件来还原数据库。

#### 保存(rdbSave)

rdbSave负责将内存中的数据库数据以RDB格式保存到磁盘中,如果RDB文件已经存在将会替换已有的RDB文件。保存RDB文件期间会阻塞主进程,这段时间期间将不能处理新的客户端请求,直到保存完成为止。

#### 读取(rdbLoad)

当Redis启动时,会根据配置的持久化模式,决定是否读取RDB文件,并将其中的对象加载到内存中。

### Redis持久化-AOF

以协议文本的方式,将所有对数据库进行的写入命令记录到AOF文件,达到记录数据库状态的目的。

#### AOF的保存

1. 将客户端请求的命令转换为网络协议格式
2. 将协议内容字符串追加到变量server.aof_buf中
3. 当AOF系统达到设定的条件时,会调用aof_fsync(文件描述符号)将数据写入磁盘

#### AOF的读取

1. AOF保存的是数据协议格式的数据,所以只要将AOF中的数据转换为命令,模拟客户端重新执行一遍,就可以还原所有数据库状态。
2. 创建模拟的客户端
3. 读取AOF保存的文本,还原数据为原命令和原参数。然后使用模拟的客户端发出这个命令请求。
4. 继续执行第二步,直到读取完AOF文件

#### AOF重写流程

1. AOF重写完成会向主进程发送一个完成的信号
2. 会将AOF重写缓存中的数据全部写入到文件中
3. 用新的AOF文件,覆盖原有的AOF文件。
168 changes: 168 additions & 0 deletions Liunx面试笔记/数据库/SQL语句.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
## SQL语句

###

#### 增创建用户:

```mysql
mysql>create user test@‘%’ identified by ‘123456’;
```

#### 创建数据库:

```mysql
mysql>create database web;
```

#### 创建数据表:

```mysql
mysql>create table a1 (id int ,name char(30));
```

#### 插入数据:

```mysql
mysql>insert into a2 (id,name,age) values (1,‘zhangsan’,21);
```

###

#### 删除用户:

```mysql
mysql>drop user test@’%’;
```

#### 删除数据库:

```mysql
mysql>drop database web;
```

#### 删除数据表:

```mysql
mysql>drop table a1;
```

#### 删除数据:

```mysql
mysql>delete from a2 where id=5;

mysql>delete from a2 where age between 23 and 25;
```

###

#### 修改表中的数据:

```mysql
mysql>update a2 set age=21 where id=3;
```

#### 修改数据表的名称:

```mysql
mysql>alter table a2 rename a1;
```



#### 修改数据表的字段类型:

```mysql
mysql>describe a1;

mysql>alter table a1 modify name char(50);

mysql>describe a1;
```

#### 修改数据表的字段类型:

```mysql
mysql>alter table a1 change name username char(50) not null default ‘’;

mysql>describe a1;
```

#### 添加删除字段

```mysql
mysql>alter table a1 add time datetime;

mysql>alter table a1 drop time;
```

###

#### 查看所有数据库:

```mysql
mysql>show databases;
```

#### 查看指定库内所有数据表:

```mysql
mysql>show tables;
```

#### 查看指定数据表的字段结构:

```mysql
mysql>describe a1;
```

#### 查看所有MySQL用户密码及登录方式:

```mysql
mysql>select User,Password,Host from mysql.user;
```

### 授权

#### 授予用户全部权限:

```mysql
mysql>grant all on aa.a1 to test@‘%’;#给已存在用户授权

mysql>grant all on aa.a1 to abc@‘%’ identified by ‘123456’;#创建用户并授权
```

#### 取消abc用户的删除库、表、表中数据的权限:

```mysql
mysql>revoke drop,delete on aa.a1 from abc@‘%’;#取消删除权限(登录abc测试)

mysql>show grants for abc@‘%’;#查看指定用户的授权

mysql>show grants for test@‘%’;
```

### 启动关闭

#### 启动:

```mysql
service mysqld start

/etc/init.d/mysqld start

mysqld_safe &
```



#### 关闭:

```mysql
service mysqld stop

/etc/init.d/mysqld stop

mysqladmin -uroot -p123456 shutdown
```

Loading

0 comments on commit 5c598fc

Please sign in to comment.