数据库⾯试题总结
# 1. 业务是什么? 产品的功能 ⽤户的⾏为(热功能,热数据)
# 2.你们公司⽤什么版本数据库? 5.6.38 5.7.20
#3. 你们公司怎么还在⽤这么低的版本? 我们这个业务已经运⾏了4年了,⼀直⽤的5.6版本,⾮常稳定,所以说暂时没有打算升级。
# 4. GA时间问题漏洞怎么说? 答:刚去上家公司不到两年,交接的时候已经运⾏了2年多了,我接⼿的时候版本已经是5.6.38 ,应当是做过⼩版本的升级。
# 5. 我们现在公司⽤的是5.7,你能胜任吗? 能。虽然我们⽣产中⼀直使⽤的5.6,但是我对5.7,8.0的新特性已经⾜够了解了。所以我完全能够胜任股公司的⼯作
# 6. 报错?
[root@db01 bin]# /data/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/mysql
--datadir=/data/mysql/data /data/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
[root@db01 bin]# [root@db01 ~]# yum install -y libaio-devel
# 7.关于初始化的新特性(5.6 和 5.7 ) 5.6 版本的初始化程序: /data/mysql/scripts/mysql_install_db --user=mysql --basedir=/data/mysql --datadir=/data/mysql/data
初始化完成后:⽆密码和⽆安全策略的 5.7 版本的初始化程序:
(1) /data/mysql/bin/mysqld --initialize --user=mysql --basedir=/data/mysql --datadir=/data/mysql/datamysql面试题sql
(2) /data/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/mysql --datadir=/data/mysql/data
提⽰:5.7以后初始化命令变为bin/mysqld命令,提供了两种初始化⽅式 第⼀种初始化⽅式:开启临时密码和安全策略 第⼆种初始化⽅式和之前版本⼀样,是⽆密码⽆安全策略。 演⽰: 2019-04-03T03:40:15.595883Z 1 [Note] A temporary password is generated for root@localhost: **MWht)!4%sa,3** 安全策略? 密码的复杂度进⾏了要求,对于密码的过期时间设置了限制
# 8. 启动报错
思路是看⽇志,⽇志⾏中[ERROR]的
9.报错
以上问题是:已经启动了,在此启动会说⽂件占⽤
10.为什么数据库连接不上?
没启动,账号密码错误,IP 、port 、 socket,分配不了连接线程
11.报错
12. SQL92是什么?小程序的功能及特点
关系型数据库中(MySQL,Oracle,MSSQL,DB2,PG):SQL语句的标准
13. 问题
[root@db01 ~]# mysql -uroot -p -S /tmp/mysql.sock -h 10.0.0.51 -P3306
Enter password:
mysql> show processlist;
+----+------+------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+------------+------+---------+------+----------+------------------+
| 15 | root | localhost | NULL | Sleep | 25 | | NULL |
| 16 | root | db01:39646 | NULL | Query | 0 | starting | show processlist |
+----+------+------------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)
14. mysql root密码忘记了?
1. 挂维护页
2. 关数据库
[root@db01 ~]# systemctl stop mysqld
3. 跳过授权启动
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
--skip-grant-tables : 连接层关闭验证模块,所有验证表不加载。
--skip-networking :连接层关闭TCP/IP协议,禁⽌远程访问。
4. 改密码
mysql> alter user root@'localhost' identified by '456';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql>
mysql>
mysql>
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> alter user root@'localhost' identified by '456';
Query OK, 0 rows affected (0.00 sec)
mysql>
[root@db01 ~]# pkill mysqld
[root@db01 ~]# systemctl start mysqld
5.正常开启业务
15. 初始化配置优先级
命令⾏>配置⽂件>预编译
16. mysql命令⾏显⽰定义
prompt=Master [\\d]>
17.报错
18.数据库启动不了
1.先看⽇志
2. 配置⽂件
3. 数据
4. 终极⼤招 mysqld --defaults-file=xxxx --user=mysql &
19. char和varchar的优缺点,⽣产如何选择?databinder是什么意思
char(11) :***定长***的字符串类型,在存储字符串时,最⼤字符长度11个,⽴即分配11个字符长度的存储空间,如果存不满,***空格***填充。
varchar(11):***变******长***的字符串类型看,最⼤字符长度11个。在存储字符串时,⾃动判断字符长度,***按需***分配存储空间。
优缺点:
1. char类型存储时,相⽐varchar类型存储效率更⾼,不需要判断字符长度,直接分配磁盘空间
2.varchar类型,相⽐char类型,按需分配空间。
选择?
1. 从原则上来讲,将来字符串长度不固定的话,选择varchar类型,字符串长度固定不变则选择char类型
2. 实际上我们⽣产中在考虑性能问题的⽅⾯,需要有⼤量插⼊(insert)操作的应⽤中,我们可以考虑使⽤char去代替varchar。
meningococcal发音3. 如果我们业务中,⼤量是查询类操作的应⽤中,数据量级⼜⽐较⼤情况下,变长长度数据类型,可以考虑采⽤varchar,⼀⽅⾯节省空间,可以有效的减少***索引树***的⾼度,从⽽提⾼索引的优化查询的效果。
20. 为什么数据库名,不能有⼤写字母。
开发环境通常是windows的,不区分⼤⼩写,线上环境通常是Linux,区分⼤⼩写的。
21 . 领导让你熟悉数据库业务
1. 和开发混到好,直接他要ER图
2. 谁也不认识:
use xuexiao
show tables;
desc xuesheng;
show create table xuesheng;
select * from xuesheng where id <5
create table ceshi like xuesheng; (复制结构⼀样的空表)
union 和 union all区别
union 对结果集进⾏去重复,union all 不去重复
在5.7 中,sql_mode使⽤的是严格模式
sql_mode=only_full_group_by
参数的意思是:
在select 后的查询列,必须是在group by出现过的列,或者使⽤函数括起来的。
否则group by语句会报错
image
24. b-tree与b+tree的区别?
叶⼦节点中,会存储相邻叶⼦结点的指针,可以很⼤程度优化范围查询(> < >= <=)
在使用控件时需要处理的是信号25. 为什么char和varchar会对索引⾼度产⽣影响?
变长长度字符串,使⽤char类型,在数据量级很⼤的时候,使⽤此列建索引⾼度变⾼
为什么表设计时设置为⾮空?
针对辅助索引,如果出现⼤量空值,会导致索引失效
26. 联合索引使⽤原则:
1. 如果是where条件后有多列等值查询,那么只需要将这多列进⾏联合索引即可(= and or in)
但是,我们建索引是尽量将唯⼀值多的列放在前⾯,尽量满⾜优化器的算法规则
2.如果是 where A group by B order by C,必须按照语句的执⾏顺序建⽴联合索引
27. SQL⾯试题
p_p_name,urse_id) from e
join c
p_p_id
where e.dept_name='技术部';
select e.urse,count(emp_id)
from e
join c
p_p_id
join t
urse_urse_id
where c.score>=60
p_p_name ,
case c.score
when c.score< 60
then '不及格'
when c.score >=60 and c.scoe <70
then '及格'
when score >=70 and c.scoe <85
then '良好'
python安装包免费下载when score >=85
then '优秀'
END as '评级'
from e
join c
p_p_id
join t
urse_se_id
a_name='张三'
select e.detp_name ,e.emp_urse_name,count(c.score)
from e
join c
p_p_id
join t
urse_urse_id
where count(c.score)>0
order urse_name, c.score desc
limit 3
p_urse_name ,avg(c.score)
from e
join c
p_p_id
join t
urse_urse_id
urse_name in (‘数据库’,'java')
group p_name
having urse_name)>1
28 . 报错原因是什么?
1.数据库没有启动
2.socket⽂件位置不对
29. 数据库损坏?
物理损坏
逻辑损坏
30 . 从mysqldump 全备中获取库和表的备份
1、获得表结构
# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q' full.sql>createtable.sql
2、获得INSERT INTO 语句,⽤于数据的恢复
# grep -i 'INSERT INTO `city`' full.sqll >data.sql &
3.获取单库的备份
# sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql
31.⾯试题
1. 联合索引: idx(status , signal)
2. 查询条件调整 where status and signal
数据和类型 ,not null ,注释
SQL语句是数据DDL操作,是属于列的添加操作
直接执⾏时会产⽣表锁,对业务的影响较⼤,数据量⼤,业务量⼤时,对于业务影响较⼤。
所以我们推荐使⽤ pt-osc ⼯具来进⾏online DDL,减少对业务的影响
A->B架构转换
1. 主库写压⼒⼤,可以通过多级主从减轻主库的压⼒
B-》A架构转换
2.业务读多写少,通过多从库实现读写分离和读的负载均衡,另外可以配合MHA等架构进⾏⾼可⽤32.报错
33 MySQL5.7中如何独⽴undo
innodb_max_undo_log_size = 128M
innodb_undo_log_truncate = ON
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_purge_rseg_truncate_frequency = 10
34 mysqldump 导出时,去掉auto_increment mysqldump -uroot -p -d test -S /tmp/mysql.sock | sed 's/AUTO_INCREMENT=[0-9]*\s*//g' > test.sql 35 MySQL 5.7 如何开启ssl功能
1.⽣成证书⽂件
[root@mycat1 ~]# mysql_ssl_rsa_setup
[root@mycat1 ~]# ll /data/mysql/*.pem
-rw------- 1 root root 1675 Jun 10 16:00 /data/mysql/ca-key.pem
-rw-r--r-- 1 root root 1107 Jun 10 16:00 /data/mysql/ca.pem
-rw-r--r-- 1 root root 1107 Jun 10 16:00 /data/mysql/client-cert.pem
-rw------- 1 root root 1675 Jun 10 16:00 /data/mysql/client-key.pem
-rw------- 1 root root 1679 Jun 10 16:00 /data/mysql/private_key.pem
-rw-r--r-- 1 root root 451 Jun 10 16:00 /data/mysql/public_key.pem
-rw-r--r-- 1 root root 1107 Jun 10 16:00 /data/mysql/server-cert.pem
-rw------- 1 root root 1675 Jun 10 16:00 /data/mysql/server-key.pem
2.证书⽂件介绍
ca-key.pem #CA私钥
ca.pem #⾃签的CA证书,客户端连接也需要提供
client-cert.pem #客户端连接服务器端需要提供的证书⽂件
client-key.pem #客户端连接服务器端需要提供的私钥⽂件
private_key.pem #私钥/公钥对的私有成员
public_key.pem #私钥/公钥对的共有成员
server-cert.pem #服务器端证书⽂件
server-key.pem #服务器端私钥⽂件
3. 未完待续
36. 为什么很多⼈喜欢使⽤varchar(255)?
1. InnoDB存储引擎的表索引单⼀字段或前缀长度,最长是767字节(bytes)。
存中⽂时,utf8字符集,那么767/3=255,
如果是utf8mb4应当是,767/4=191.
2. 字符串长度值视实际数据长度,需占⽤ 1 或 2 个字节存储。
当实际数据长度 <= 255 时,varchar字段长度 = 1 + N
当实际数据长度 > 255 时,varchar字段长度 = 2 + N
总结:其实是很多开发⼈员的⼀些习惯吧,但是往往不知道原因。所以呢带⼤家普及⼀下。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论