数据库面试题(三)

2687 篇文章 26 订阅
253 篇文章 1 订阅

简述 MySQL 数据库访问的执行过程。

1)客户端发出请求。

2)服务器端开辟线程响应客户端请求。

3)客户端发起 sql 语句查询数据库。

4)查询缓存:记录用户的 sql 查询语句,如果查询内容相同,直接从查询缓存回复。

5)如果缓存没有进入分析器。

6)分析器:分析用户命令语法是否正确,将用户的命令进行切片,一个词一个词用空格隔开,获得用户要查询的表、内容、用户的权限等。

7)优化器:执行路径的选择,生成执行树。(每个 SQL 语句都有很多执行路径,优化的目的就是在这些执行路径里选择最优的执行路径)。

8)存储引擎:用于管理存储的文件系统,指带有数据库并整合了数据库管理软件的计算机系统不同的存储引擎有不同的功能和存储方式。

GRANT 配置授权用法和注意事项?

基本用法

GRANT 权限列表 .. .. ON 库名 . 表名

TO 用户名 @' 客户端地址 '

IDENTIFIED BY ' 密码 '

[ WITH GRANT OPTION ];

注意事项

当 库名 . 表名 为  *.* 时, 匹配所有库所有表 – 授权设置存放在 mysql 库的user 表

mysql 授权的权限列表分类?

  • all :匹配所有权限

  • SELECT,UPDATE,INSERT .. ..等其它权限

  • SELECT,UPDATE ( 字段 1, .. .. , 字段 N) 具体库、表等

mysql 授权的客户端地址方法?

  • % :匹配所有主机

  • 192.168.1.% :匹配指定的一个网段

  • 192.168.1.1 :匹配指定 IP 地址的单个主机

  • %.tarena.com :匹配一个 DNS 区域

  • svr1.tarena.com :匹配指定域名的单个主机

撤销用户权限的格式用法?

基本用法

– REVOKE 权限列表 ON 库名 . 表名 – FROM 用户名 @' 客户端地址 ';

简述 MySQL 数据库中插入、更新、查询、删除表记录的指令格式。

连接到 MySQL 数据库服务器,

1)向表中插入记录的语法格式

insert into 表名(字段名列表) values(字段名=值,字段名=值,…);

2)更新表记录的语法格式

update 表名 set (字段名=值,字段名=值,…) where(条件表达式列表);

3)查询表记录的语法格式

select (字段名列表) from 表名 (where) 条件表达式列表;

4)删除表记录的语法格式

delete from 表名 where( 条件表达式列表);

数据备份策略有那几种?

完全备份

– 备份所有数据(一台服务器、一个库、一张表)

增量备份

– 备份自上一次备份(包含完全备份、差异备份、增量 备份)之后有变化的数据

差异备份

– 备份自上一次完全备份之后有变化的数据

逻辑备份及恢复

备份操作

mysqldump 源库名 > 路径 /xxx.sql mysql 目标库名 < 路径 /xxx.sql

恢复操作

mysql 目标库名 < 路径 /xxx.sql

利用 binlog 恢复数据的基本思路?

使用 mysql binlog 提取历史 SQL 操作

通过管道交给 mysql 命令执行

常用的 MySQL 备份工具 的缺点?

物理备份缺点

  • 跨平台性差

  • 备份时间长、冗余备份、浪费存储空间

mysqldump 备份缺点

  • 效率较低, 备份和还原速度慢

  • 备份过程中, 数据插入和更新操作会锁表(被挂起)

介绍一下 XtraBackup 工具是什么?

一款强大的在线热备份工具

  • 备份过程中不锁库表, 适合生产环境

  • 由专业组织 Percona 提供(改进 MySQL 分 支)

主要含两个组件

  • xtrabackup : C 程序, 支持 InnoDB/XtraDB

  • innobackupex :以 Perl 脚本封装 xtrabackup , 还支持 MyISAM引擎

什么是读写分离?

读写分离(Read/Write Splitting)

基本的原理是让主数据库处理事务性查询, 而从数据库处理 SELECT 查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。 当然, 主服务器也可以提供查询服务。使用读写分离最大的作用无非是缓解服务器压力

读写分离的好处?

  • 增加冗余

  • 增加了机器的处理能力

  • 对于读操作为主的应用, 使用读写分离是最好的场景, 因为可以确保写的服务器压力更小, 而读又可以接受点时间上的延迟。

读写分离提高性能之原因?

1.问题:物理服务器增加,负荷增加

2.主从只负责各自的写和读,极大程度的缓解 X 锁和 S 锁争用

3.从库可配置 myisam 引擎,提升查询性能以及节约系统开销

4.从库同步主库的数据和主库直接写还是有区别的,通过主库发送来的 binlog 恢复数

据,但是,最重要区别在于主库向从库发送 binlog 是异步的,从库恢复数据也是异步

5.读写分离适用于读远大于写的场景,如果只有一台服务器,当 select 很多时,update 和 delete 会被这些 select 访问中的数据堵塞,等待 select 结束,并发性能不高。 对于写和读比例相近的应用,应该部署双主相互复制

6.可以在从库启动是增加一些参数来提高其读的性能,例如--skip-innodb、--skip-bdb、--low-priority-updates 以及--delay-key-write=ALL。当然这些设置也是需要根据具体业务需求来定得,不一定能用上

7.分摊读取。假如我们有 1 主 3 从,不考虑上述 1 中提到的从库单方面设置,假设现在1 分钟内有 10 条写入,150 条读取。那么,1 主 3 从相当于共计 40 条写入,而读取总数没变,因此平均下来每台服务器承担了 10 条写入和 50 条读取(主库不承担读取操作)。因此,虽然写入没变,但是读取大大分摊了,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了,说白了就是拿机器和带宽换性能。

MySQL 官方文档中有相关演算公式:官方文档 见 6.9FAQ 之“MySQL 复制能够何时和多大程度提高系统性能

构建主从同步的思路?

  • 确保数据相同 – 从库必须要有主库上的数据。

  • 配置主服务器 – 启用 binlog 日志及设置格式, 设置 server_id, 授权用户

  • 配置从服务器 – 设置 server_id , 指定主数据库服务器信息

  • 测试配置 – 客户端连接主库, 写入的数据, 在连接从库的时候也能够访问到。

注意:MySQL 复制另外一大功能是增加冗余,提高可用性,当一台数据库服务器宕机后能通过调整另外一台从库来以最快的速度恢复服务, 因此不能光看性能, 也就是说 1 主 1 从也是可以的。

复制模式都有哪些?

异步复制( Asynchronous replication )

– 主库在执行完客户端提交的事务后会立即将结果返给 客户端, 并不关心从库是否已经接收并处理。

全同步复制( Fully synchronous replication )

– 当主库执行完一个事务, 所有的从库都执行了该事务 才返回给客户端。

半同步复制( Semisynchronous replication )

– 介于异步复制和全同步复制之间, 主库在执行完客户 端提交的事务后不是立刻返回给客户端, 而是等待至 少一个从库接收到并写到 relay log 中才返回给客户端

MySQL 主从复制原理?

1)、Slave 上面的 IO 进程连接上 Master,并请求从指定日志文件的指定位置(或者

从最开始的日志)之后的日志内容;

2)、Master 接收到来自 Slave 的 IO 进程的请求后,通过负责复制的 IO 进程根据请求信

息读取制定日志指定位置之后的日志信息,返回给 Slave 的 IO 进程。返回信息中除了日

志所包含的信息之外,还包括本次返回的信息已经到 Master 端的 bin-log 文件的名称以

及 bin-log 的位置;

3)、Slave 的 IO 进程接收到信息后,将接收到的日志内容依次添加到 Slave 端的relay-

log 文件的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到master-

info 文件中,以便在下一次读取的时候能够清楚的告诉 Master“我需要从某个bin-log 的

哪个位置开始往后的日志内容,请发给我”;

4)、Slave 的 Sql 进程检测到 relay-log 中新增加了内容后,会马上解析 relay-log的内容

成为在 Master 端真实执行时候的那些可执行的内容,并在自身执行。

Mysql 为了解决这个风险并提高复制的性能,将 Slave 端的复制改为两个进程来完成。

提出这个改进方案的人是 Yahoo!的一位工程师“Jeremy Zawodny”。这样既解决了性能

问题,又缩短了异步的延时时间,同时也减少了可能存在的数据丢失量。当然,即使是

换成了现在这样两个线程处理以后,同样也还是存在 slave 数据延时以及数据丢失的可

能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事物中,这些问题都是会

存在的。如果要完全避免这些问题,就只能用 mysql 的 cluster 来解决了。不过mysql

的 cluster 是内存数据库的解决方案,需要将所有数据都 load 到内存中,这样就对内存

的要求就非常大了,对于一般的应用来说可实施性不是太大。

复制常用架构

Mysql 复制环境 90%以上都是一个 Master 带一个或者多个 Slave 的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只要 master和slave 的压力不是太大(尤其是 slave 端压力)的话,异步复制的延时一般都很少很少。尤其是自slave 端的复制方式改成两个进程处理之后,更是减小了 slave 端的延时。而带来的效益是,对于数据实时性要求不是特别的敏感度的应用,只需要通过廉价的 pcserver 来扩展 slave 的数量,将读压力分散到多台 slave 的机器上面,即可解决数据库端的读压力瓶颈。这在很大程度上解决了目前很多中小型网站的数据库压力瓶颈问题,甚至有些大型网站也在使用类似方案解决数据库瓶颈。

什么是多实例 , 为什么要使用多实例

  • 在一台物理主机上运行多个数据库服务就叫作多实例。

  • 节约运维成本 – 提高硬件利用率

多实例配置步骤?

  • 安装支持多实例服务的软件包

  • 修改主配置文件

  • 根据配置文件做相应设置

  • 初始化授权库

  • 启动服务

  • 客户端访问

MySQL 性能调优的作用和方法?

提高 MySQL 系统的性能、响应速度

  • 替换有问题的硬件( CPU/ 磁盘 / 内存等)

  • 服务程序的运行参数调整(配置文件)

  • 对 SQL 查询进行优化

介绍下 MHA 集群?

  • 由日本 DeNA 公司 youshimaton (现就职于 Facebo ok 公司)开发是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。

  • 目前在 MySQL 高可用方面是一个相对成熟的解决方案 。

  • 在 MySQL 故障切换过程中, MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中 MHA 能在最大程度上保证数据的一致性, 以达到真正意义上的高可用。

MHA 的组成由哪些? MHA Manager (管理节点)

  • 可以单独部署在一台独立的机器上管理多个 master-slave 集群, 也可以部署在一台 slave 节点上。

  • MHA Node (数据节点)

  • 运行在每台 MySQL 服务器上。

MHA 的工作过程?

MHA Manager 会定时探测集群中的 master 节点,指带有数据库并整合了数据库管理软件的计算机系统 当 master 出现故障时,指带有数据库并整合了数据库管理软件的计算机系统,它可以自动将最新数据的 sl ave 提升为新的 master ,指带有数据库并整合了数据库管理软件的计算机系统 然后将所有其他的 slave 重新指向新的 master 。整个故障转移过程对应用程序完全透明。

( 1 )从宕机崩溃的 master 保存二进制日志事件( binlog events )

( 2 )识别含有最新更新的 slave

( 3 )应用差异的中继日志( relay log )到其他的 slave

( 4 )应用从 master 保存的二进制日志事件( binlog events )

( 5 )提升一个 slave 为新的 master ;

( 6 )使其他的 slave 连接新的 master 进行复制;

什么是视图 (View)

视图实际上是一个虚拟表

– 内容与真实的表相似, 包含一系列带有名称的列和行数据。

  • 视图并不在数据库中以存储的数据的形式存在。

  • 行和列的数据来自定义视图时查询所引用的基表, 并 且在具体引用视图时动态生 成。

  • 更新视图的数据, 就是更新基表的数据

  • 更新基表数据, 视图的数据也会跟着改变

视图优点有哪些?

  • 简单

    使用视图的用户完全不需要关心视图中的数据是通过什么查询得到的。视图中的数据对用户来说已经是过滤好的符合条件的 结果集。

  • 安全

    用户只能看到视图中的数据。

  • 数据独立

    一旦视图的结构确定了, 可以屏蔽表结构变化对用户的影响。

使用视图的限制有哪些?

  • 不能在视图上创建索引

  • 在视图的 FROM 子句中不能使用子查询

  • 当视图中包含如下内容时,视图的更新操作不能被执行

    1、视图中包含,基本表中被定义为非空的列

    2、在定义视图的SELECT语句后的字段列表中,使用了数学表达式

    3、在定义视图的SELECT语句后的字段列表中,使用了聚合函数

    4、在定义视图的SELECT语句中,使用了DISTINCT、UNION、TOP、GROUP BY或者HAVING子句

视图的语法格式是什么?

create view 视图名称 as SQL (select)查询语句

create view 视图名称 (具体字段名列表) as SQL (select)查询语句

使用视图的语法格式?

  • 查询记录

Select 字段名列表 from 视图名 where 条件;

  • 插入记录

Insert into 视图名 ( 字段名列表 ) values( 字段值列 表 ) ;

  • 更新记录

Update 视图名 set 字段名 = 值 where 条件;

  • 删除记录

Delete from 视图名 where 条件;

注意:对视图操作即是对基本操作, 反之亦然!!!

  • 删除视图

drop view 视图名;

最后: 下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取【保证100%免费】

在这里插入图片描述

 这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

面试文档获取方式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值