当前位置:Gxlcms > 数据库问题 > mysql面试题分享

mysql面试题分享

时间:2021-07-01 10:21:17 帮助过:9人阅读

1.?????? 开启MySQL服务

service mysqld start

/init.d/mysqld start

safe_mysql &

关闭mysql服务

service mysqld stop

/etc/init.d/mysqld stop

mysqladmin -uroot -p123456 shutdown

2.?????? 检测端口是否运行

lsof -i:3306

netstat -tunlp|grep 3306

ss -tulnp|grep 3306

3.?????? MySQL设置密码或者修改密码。

方法一

mysqladmin -u root -p123456 password ‘abc123‘??? #比较常用

方法二(sql语句修改)

update mysql.user set password=password(123456) where user=‘root‘ and host=‘localhost‘;

flush privileges;

方法三(sql语句修改)

set password=password(‘abc123‘);

4.?????? 登陆MySQL数据库。

单实例登陆

mysql -uroot -p123456

多实例登陆

mysql -uroot -p123456 -S /data/3306/mysql.sock

5.?????? 查看当前数据库的字符集

mysql> show variables like "%charac%";

6.?????? 查看当前数据库版本

# mysql -V

mysql> select version();

7.?????? 查看当前登录的用户。

mysql> select user();

8.?????? 创建GBK字符集的数据库oldboy,并查看已建库完整语句

mysql> create database oldboy default character set gbk;

mysql> show create database oldboy;

9.?????? 创建用户oldboy,使之可以管理数据库oldboy

mysql> grant select,update,insert,delete,alter on oldboy.* to oldboy@‘localhost‘ identified by ‘123456‘;

10.?? 查看创建的用户oldboy拥有哪些权限

mysql> show grants for oldboy@‘localhost‘;

11.?? 查看当前数据库里有哪些用户

mysql> select user,host from mysql.user;

12.?? 进入oldboy数据库

mysql> use oldboy();

13.?? 创建一个innodb GBKtest,字段id int(4)name varchar(16)

mysql> create table test (id int(4),name varchar(16)) engine=InnoDB default charset=gbk;

14.?? 查看建表结构及表结构的SQL语句

mysql> desc test;

mysql> show create table test\G

15.?? 插入一条数据“1,oldboy

mysql> insert into test (id,name) values (1,‘oldboy‘);

16.?? 再批量插入2行数据 2,老男孩”,“3,oldboyedu

mysql> insert into test (id,name) values (2,‘老男孩‘),(3,‘oldboyedu‘);

17.?? 查询名字为oldboy的记录

mysql> select * from test where name=‘oldboy‘;

18.?? 把数据id等于1的名字oldboy更改为oldgirl

mysql> update test set name=‘oldgirl‘ where id=1;

19.?? 在字段name前插入age字段,类型tinyint(2)

mysql> alter table test add age tinyint(2) after id;

20.?? 不退出数据库,完成备份oldboy数据库

mysql> system mysqldump -uroot -p123456 -B -x -F --events oldboy >/opt/bak.sql

21.?? 删除test表中的所有数据,并查看

mysql> delete from test;

22.?? 删除表testoldboy数据库并查看

mysql> drop table test;

mysql> drop database oldboy;

23.?? 不退出数据库恢复以上删除的数据

mysql> system mysql -uroot -p123456 </opt/bak.sql???

24.?? 把库表的GBK字符集修改为UTF8

mysql> alter database oldboy default character set utf8;

mysql> alter table test default character set utf8;

25.?? id列设置为主键,在Name字段上创建普通索引。

mysql> alter table test add primary key(id);

方法一:

mysql> alter table test add index index_name(name);

方法二:

mysql> create index index_name on test(name);

26.?? 在字段name后插入手机号字段(shouji),类型char(11)

mysql> alter table test add shouji char(11) after name;

27.?? 所有字段上插入2条记录(自行设定数据)

mysql> insert into test (id,age,name,shouji) values (‘4‘,‘27‘,‘wangning‘,‘13833573773‘);

mysql> insert into test (id,age,name,shouji) values (‘5‘,‘30‘,‘litao‘,‘13833573773‘);

28.?? 在手机字段上对前8个字符创建普通索引

方法一:

mysql> alter table test add index index_shouji(shouji(8));

方法二:

mysql> create index index_shouji on test(shouji(8));

29.?? 查看创建的索引及索引类型等信息。

mysql> show index from test\G

30.?? 删除Nameshouji列的索引。

mysql> alter table test drop index index_name;

mysql> alter table test drop index index_shouji;

31.?? Name列的前6个字符以及手机列的前8个字符组建联合索引。

mysql> create index index_name_shouji on test(name(6),shouji(8));

32.?? 查询手机号以135开头的,名字为oldboy的记录(提前插入)。

mysql> select * from test where name=‘oldboy‘ and shouji like "135%";

33.?? 查询上述语句的执行计划(是否使用联合索引等)。

mysql> explain select * from test where name="oldboy" and shouji like "135%"\G

34.?? test表的引擎改成MyISAM

mysql> alter table test engine=myisam;???? #myisam不区分大小写

35.?? 收回oldboy用户的select权限。

mysql> revoke select on oldboy.* from oldboy@‘localhost‘;

36.?? 删除oldboy用户。

mysql> drop user oldboy@‘localhost‘;

37.?? 删除oldboy数据库。

mysql> drop database oldboy;

38.?? 使用mysqladmin关闭数据库。

mysqladmin -uroot -p123456 shutdown

39.?? MySQL密码丢了,请找回?

?# pkill mysql??? ???????????#先关闭mysql服务

?#使用--skip-grant-tables启动mysql,忽略授权登陆验证

# mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables &

# mysql?? ????????????????#此时再登陆,已经不需要密码了

mysql> update mysql.user set password=password(‘abc123‘) where user=‘root‘ and host="localhost";?? ?????????#设置新的密码

mysql> flush privileges;

# mysql -uroot -pabc123???? #再次用新设置的密码登陆即可

?

二.MySQL运维基础知识面试问答题

40.?? 请解释关系型数据库概念及主要特点?

概念:

关系型数据库是支持采用了关系模型的数据库,简单来说,关系模型就是指二维表模型,而一个关系数据库就是由二维表及其之间的联系所组成的一个数据组织。

特点:

最大的特点就是事务的一致性。

优点:容易理解、使用方便、易于维护、支持SQL

缺点:

1.?????? 高并发读写需求:网站的用户并发非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

2.?????? 海量数据的高效读写:对于数据量巨大的网站来说,关系型数据库的查询效率非常低。

3.?????? 固定的表结构。

?

41.?? 请说出关系型数据库的典型产品、特点及应用场景?

1.SQLserver

特点:真正的客户机/服务器体系结构

????? 图形化用户界面

????? 丰富的编程接口工具

????? Windows NT完全集成

????? 具有很好的伸缩性

应用场景:

主机为Windows系统,主要应用于web网站的建设,承载中小型web后台数据。

2.MySQL

特点:体积小,总拥有成本低,开放源代码,可运行在多数系统平台上,轻量级易扩展。

应用场景:广泛的应用在Internet上的中小型网站中。

3.Oracle

特点:跨平台运行,安全性方面,性能最高。对硬件要求高,价格昂贵。

应用场景:大部分国企事业单位都用Oracle,在电信行业占用最大的份额。

?

42.?? 请解释非关系型数据库概念及主要特点?

1.?????? 使用键值对存储数据,且结构不固定

2.?????? 一般不支持ACID特性。

3.?????? 基于键值对,数据没有耦合性,容易扩展。

4.?????? 不提供SQL支持,学习和使用成本较高。

?

43.?? 请说出非关系型数据库的典型产品、特点及应用场景?

MongoDB

特点:1.高性能,易部署,易使用。

????? 2.面向集合存储,易存储对象类型的数据。

????? 3.模式自由

????? 4.自动处理碎片,以支持云计算层次的扩展性。

应用场景:

????? 网站数据:mongodb非常适合实时的插入,更新与查询。

????? 缓存:适合作为信息基础设施的缓存层

????? 大尺寸、低价值的数据

????? 高伸缩性的场景

Redis

特点:1.性能极高,能支持超过100k+每秒的读写频率

????? 2.丰富的数据类型

????? 3.所有操作都是原子性的

使用场景:

????? 少量的数据存储,高速读写访问

SQLlite

特点:

1.嵌入式的,零配置,无需安装和管理配置

2.ACID事务

3.存储在单一磁盘文件中的一个完整的数据库。

应用场景:

1.需要数据库的小型桌面软件。

2.需要数据库的手机软件。

3.作为数据容器的应用场景。

?

44.?? 请详细描述SQL语句分类及对应代表性关键字。

1DDL(Data Definition Language)---数据库定义语言(createalterdrop),管理基础数据库,例如:库,表??

2DCL(Data Control Language)---数据控制语言(grantrevokecommitrollback),用户授权,权限回收,数据提交回滚等????

3DMLData Manipulation Language)---数据操作语言(selectinsertdeleteupdate,针对数据库里的表,记录??

?

45.?? 请详细描述char(4)varchar(4)的差别。

char(4)定义的是固定长度4,存储时,如果字符数不够4位,会在后面用空格补全存入数据库。

varchar(4)定义的是变长长度,存储时,如果字符没有达到定义的位数4时,也不会在后面补空格。

?

46.?? 如何授权oldboy用户从172.16.1.0/24访问数据库。

mysql> grant all on *.* to oldboy@‘172.16.1.%‘ identified by ‘123456‘;

?

47.?? 什么是MySQL多实例,如何配置MySQL多实例?

在一台服务器上,mysql服务开启多个不同的端口,运行多个服务进程,这些mysql服务进程通过不同的socket来监听不同的数据端口,进而互不干涉的提供各自的服务。

?

48.?? 如何加强MySQL安全,请给出可行的具体措施?

1.避免直接从互联网访问mysql数据库,确保特定主机才拥有访问权限。

2.定期备份数据库

3.禁用或限制远程访问

my.cnf文件里设置bind-address指定ip

4.移除test数据库(默认匿名用户可以访问test数据库)

5.禁用local infile

mysql> select load_file("/etc/passwd");

my.cnf[mysqld]下添加set-variable=local-infile=0

6.移除匿名账户和废弃的账户

7.限制mysql数据库用户的权限

8.移除和禁用.mysql_history文件

# cat ~/.mysql_history

# export MYSQL_HISTFILE=/dev/null?

?

49.?? deletetruncate删除数据的区别

truncate table test执行更快,清空物理文件,清空表中的所有内容

delete from test是逻辑删除,按行删除,而且可以通过where语句选择要删除的行

?

50.?? MySQL Sleep线程过多如何解决

mysql> show processlist\G

# mysqladmin -uroot -p123456 processlist

修改my.cnf文件里的wait_timeout的值,让其更小一些,默认wait_timeout =28800,这里改为100

mysql> set global wait_timeout=100;

mysql> show global variables like "wait_timeout";

?

51.?? sort_buffer_size参数作用?如何在线修改生效?

mysql执行排序使用的缓冲大小。如果想要增加order by的速度,首先看是否可以让mysql使用索引而不是额外的排序阶段,如果不能,可以尝试增加sort_buffer_size变量的大小。

mysql> set global sort_buffer_size =131072;??? #单位为B,即128KB,默认64K

?

52.?? 如何在线正确清理MySQL binlog

自动清除

mysql> set global expire_logs_days=30;?? #设置binlog过期时间为30

手动清除

mysql> purge binary logs to "mysql-bin.000007";??? #/删除mysql-bin.000007之前的所有binlog日志

?

53.?? Binlog工作模式有哪些?各什么特点,企业如何选择?

1.row level行级模式

优点:记录数据详细(每行),主从一致

缺点:占用大量的磁盘空间,降低了磁盘的性能

2.statement level模式(默认)

优点:记录的简单,内容少 ,节约了IO,提高性能??? 缺点:导致主从不一致

3.MIXED混合模式

结合了statementrow模式的优点,会根据执行的每一条具体的SQL语句来区分对待记录的日志形式。对于函数,触发器,存储过程会自动使用row level模式

企业场景选择:

1.互联网公司使用mysql的功能较少(不用存储过程、触发器、函数),选择默认的statement模式。

2.用到mysql的特殊功能(存储过程、触发器、函数)则选则MIXED模式

3.用到mysql的特殊功能(存储过程、触发器、函数),有希望数据最大化一致则选择row模式。

?

54.?? 误操作执行了一个dropSQL语句,如何完整恢复?

如果条件允许,操作前最好禁止外面一切服务器访问mysql数据库,这里假设禁止外面访问数据库,具体步骤如下:

1.?????? 手动切割binlog日志并记好切割好的binlog日志文件位置,这里假设为009,备份全部binlog日志

2.?????? 找到之前全备数据最后备份到的binlog文件位置并记好位置,这几假设为005

3.?????? mysqladmin命令将005008binlog文件中的SQL语句分离出来,并找到drop库的语句将其删掉

4.?????? 将之前全备数据导入mysql服务器

5.?????? 将步骤3中分离出的SQL语句导入mysql服务器

6.?????? 009binlog文件删除,再次刷新binlog日志,到此数据库已恢复成功。

?

55.?? mysqldump备份使用了-A -B参数,如何实现恢复单表?

1.?????? 先用sedawk将全库中的需要的表结构过滤出来

sed -e ‘/./{H;$!d;}‘ -e ‘x;/CREATE TABLE `SC`/!d;q‘ /opt/bak_2017-12-07.sql

2.?????? 再用grep将全库中相应的表内容过滤出来

grep ‘INSERT INTO `SC`‘ /opt/bak_2017-12-07.sql

3.?????? 12中过滤出来的SQL语句导入数据库即可

?

56.?? 详述MySQL主从复制原理及配置主从的完整步骤

主从复制原理:



? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 技术分享图片

1.?????? 主:binlog线程,记录所有改变了数据库数据的语句,放进master上的binlog

2.?????? 从:IO线程,在使用start slave之后,负责从master上拉取binlog内容,放进自己的relay log

3.?????? 从:SQL执行线程,执行relay log中的语句。

?

配置步骤:

1.?????? 主库开启binlog日志功能

2.?????? 全备数据库,记录好binlog文件和相应的位置

3.?????? 从库上配置和主库的连接信息

4.?????? 将全备数据导入从库

5.?????? 从库启动slave

6.?????? 在从库上查看同步状态,确认是否同步成功

?

57.?? 如何开启从库的binlog功能?

my.cnf文件中写入log-bin=mysql-bin

?

58.?? MySQL如何实现双向互为主从复制,并说明应用场景?

两台数据库都开启binlog功能,相互为主从配置。

双主的实现方式主要有两种:

1.?????? 让表的ID自增,然后主1135,主2246

2.?????? 不让表的ID自增,然后通过web端程序去seq服务器取ID,写入双主。

双主工作场景为高并发写的场景,慎用。

?

59.?? MySQL如何实现级联同步,并说明应用场景?

第一台数据库开启binlog功能设为主服务器,第二台数据库也开启binlog功能,设为第一台服务器的从服务器,设为其他数据库的主服务器

?

60.?? MySQL主从复制故障如何解决?

解决办法1

登陆从库上操作:

1.?????? stop slave 临时停止同步开关

2.?????? set global sql_slave_skip_counter=1,将同步指针向下移动一个,也可以多个,如果多次不同步,可以重复操作。

3.?????? start slave,重启主从复制开关

解决办法2

my.cnf配置文件中加入参数

slave-skip-errors=1032,1062,1007

?

61.?? 如何监控主从复制是否故障?

查看slave端的IOSQL进程状态是否OK,同步延迟时间是否小于1分钟

mysql> show slave status\G

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Seconds_Behind_Master: 0

?

62.?? MySQL数据库如何实现读写分离?

1.?????? 通过程序实现读写分离(性能,效率最佳,推荐

PHPJava程序都可以通过设置多个连接文件轻松的实现对数据库的读写分离,即当select时,就去连接读库的连接文件,当updateinsertdelete是就去连接写库的连接文件。

2.?????? 通过软件实现读写分离

MySQL-proxy,Amoeba等代理软件也可以实现读写分离功能,但最常用最好用的还是程序实现读写分离。

3.?????? 开发dbproxy

?

63.?? 生产一主多从从库宕机,如何手工恢复?

处理方法:重做slave

1.?????? 停止slave

2.?????? 导入备份数据

3.?????? 配置master.info信息

4.?????? 启动slave

5.?????? 检查从库状态

?

64.?? 生产一主多从主库宕机,如何手工恢复?

主库宕机分为数据库宕机和服务器宕机2种,不管哪种都要进行主从切换。

1.登陆从库检查IO线程和SQL线程状态show processlist\G,确认SQL线程已读完所有relay-log

2.登陆所有从库检查master.info信息,查看哪个从库的binlog文件和位置是最新的,选择最新的从库切换为主库(或利用半同步功能,直接选择做了实时同步的从库为主库)

3.如果主库只是数据库宕了,服务器还在运行,则可以把binlog拉取到提升为主库的从库应用。

4.登陆要切换为主库的从库,进行切换操作。

?stop slave;reset master;quit

5.进入要切换的从库数据目录,删除master.inforelay-log.info文件,并检查授权表,read_only等参数

6.修改my.cnf配置文件,开启binlog,注释从库参数

log-bin=/data/3307/mysql-bin

#log-slave-updates

#read-only

7.?????? 对同步用户进行提权,保证权限与主库用户权限一样

8.

人气教程排行