国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 程序人生 > 程序员面试 > 【面试】【MySQL常见问题总结】【04】

【面试】【MySQL常见问题总结】【04】

来源:程序员人生   发布时间:2016-06-29 18:11:53 阅读次数:5000次

【常见面试问题总结目录>>>】


091 数据库死锁概念

  多数情况下,可以认为如果1个资源被锁定,它总会在以后某个时间被释放。而死锁产生在当多个进程访问同1数据库时,其中每一个进程具有的锁都是其他进程所需的,由此造成每一个进程都没法继续下去。简单的说,进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就相互等待就构成死锁。
  虽然进程在运行进程中,可能产生死锁,但死锁的产生也必须具有1定的条件,死锁的产生必须具有以下4个必要条件。
  1)互斥条件:指进程对所分配到的资源进行排它性使用,即在1段时间内某资源只由1个进程占用。如果此时还有其它进程要求资源,则要求者只能等待,直至占有资源的进程用毕释放。
  2)要求和保持条件:指进程已保持最少1个资源,但又提出了新的资源要求,而该资源已被其它进程占有,此时要求进程阻塞,但又对自己已取得的其它资源保持不放。
  3)不剥夺条件:指进程已取得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
  4)环路等待条件:指在产生死锁时,必定存在1个进程——资源的环形链,即进程集合{P0,P1,P2,•••,Pn}中的P0正在等待1个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
  以下方法有助于最大限度地下降死锁:
  (1)按同1顺序访问对象。
  (2)避免事务中的用户交互。
  (3)保持事务简短并在1个批处理中。
  (4)使用低隔离级别。
  (5)使用绑定连接。

092 数据库有几种数据保护方式(AAA)

  实现数据库安全性控制的经常使用方法和技术有:用户标识和鉴别;存取控制;视图机制;审计;数据加密;

093 union和union all 的区分和使用

  Union由于要进行重复值扫描,所以效力低。如果合并没有刻意要删除重复行,那末就使用Union All两个要联合的SQL语句 字段个数必须1样,而且字段类型要“相容”(1致);
  union和union all的区分是,union会自动紧缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不论是不是重复。
  Union:对两个结果集进行并集操作,不包括重复行,同时进行默许规则的排序;
  Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
  Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默许规则的排序;
  Minus:对两个结果集进行差操作,不包括重复行,同时进行默许规则的排序。
  可以在最后1个结果集中指定Order by子句改变排序方式。

094 mysql的备份命令是甚么

  mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql
    备份MySQL数据库为带删除表的格式
    备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库
  mysqldump -–add-drop-table -uusername -ppassword databasename > backupfile.sql
    直接将MySQL数据库紧缩备份
  mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz
    备份MySQL数据库某个(些)表
  mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
    同时备份多个MySQL数据库
  mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql
    仅仅备份数据库结构
  mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
    备份服务器上所有数据库
  mysqldump –all-databases > allbackupfile.sql
    还原MySQL数据库的命令
  mysql -hhostname -uusername -ppassword databasename < backupfile.sql
    还原紧缩的MySQL数据库
  gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
    将数据库转移到新服务器
  mysqldump -uusername -ppassword databasename | mysql –host=... -C databasename

095 在mysql服务器运行缓慢的情况下输入甚么命令能减缓服务器压力

  第1步 检查系统的状态
    通过操作系统的1些工具检查系统的状态,比如CPU、内存、交换、磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是1个正常的状态,由于cpu可能正等待IO的完成。除此以外,还应观注那些占用系统资源(cpu、内存)的进程。
    1.1 使用sar来检查操作系统是不是存在IO问题
    1.2 使用vmstat监控内存 cpu资源
    1.3 磁盘IO问题,处理方式:做raid10提高性能
    1.4 网络问题,telnet1下MySQL对外开放的端口,如果不通的话,看看防火墙是不是正确设置了。另外,看看MySQL是否是开启了skip-networking的选项,如果开启请关闭。
  第2步 检查mysql参数
    2.1 max_connect_errors
    2.2 connect_timeout
    2.3 skip-name-resolve
    2.4 slave-net-timeout=seconds
    2.5 master-connect-retry
  第3步 检查mysql 相干状态值
    3.1 关注连接数
    3.2 关注下系统锁情况
    3.3 关注慢查询(slow query)日志

096 怎样导出表结构?

  1.导出全部数据库
    mysqldump -u用户名 -p密码 数据库名 > 导出的文件名
    C:\Users\jack> mysqldump -uroot -pmysql sva_rec > e:\sva_rec.sql
  2.导出1个表,包括表结构和数据
    mysqldump -u用户名 -p 密码 数据库名 表名> 导出的文件名
    C:\Users\jack> mysqldump -uroot -pmysql sva_rec date_rec_drv> e:\date_rec_drv.sql
  3.导出1个数据库结构
    C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec > e:\sva_rec.sql
  4.导出1个表,只有表结构
    mysqldump -u用户名 -p 密码 -d数据库名 表名> 导出的文件名
    C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec date_rec_drv> e:\date_rec_drv.sql
  5.导入数据库
    经常使用source 命令
    进入mysql数据库控制台,
    如mysql -u root -p
    mysql>use 数据库
    然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
    mysql>source d:wcnc_db.sql

097 正常登入MYSQL后使用甚么命令查看其进程是不是正常

  输入show processlist;
  如果有SUPER权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。

098 mysql远程连接命令

  1、MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格)
    C:>mysql -h localhost -u root -p123
  2、MySQL 连接远程数据库(192.168.0.201),端口“3306”,用户名为“root”,密码“123”
    C:>mysql -h 192.168.0.201 -P 3306 -u root -p123

099 mysql主从用甚么方式传输日志

  MySQL 复制基于主服务器在2进制日志中跟踪所有对数据库的更改(更新、删除等等)。每一个从服务器从主服务器接收主服务器已记录到其2进制日志的保存的更新,以便从服务器可以对其数据拷贝履行相同的更新。

100 数据库的备份方式

  1、完全备份,这是大多数人经常使用的方式,它可以备份全部数据库,包括用户表、系统表、索引、视图和存储进程等所有数据库对象。但它需要花费更多的时间和空间,所以,1般推荐1周做1次完全备份。
  2、事务日志备份,事务日志是1个单独的文件,它记录数据库的改变,备份的时候只需要复制自上次备份以来对数据库所做的改变,所以只需要很少的时间。为了使数据库具有鲁棒性,推荐每小时乃至更频繁的备份事务日志。
  3、差异备份也叫增量备份。它是只备份数据库1部份的另外一种方法,它不使用事务日志,相反,它使用全部数据库的1种新映象。它比最初的完全备份小,由于它只包括自上次完全备份以来所改变的数据库。它的优点是存储和恢复速度快。推荐每天做1次差异备份。
  4、文件备份数据库可以由硬盘上的许多文件构成。如果这个数据库非常大,并且1个晚上也不能将它备份完,那末可使用文件备份每晚备份数据库的1部份。由于1般情况下数据库不会大到必须使用多个文件存储,所以这类备份不是很经常使用。

101 查看mysql数据库是不是支持innodb

  查看mysql的存储引擎:show plugins;
  如何在mysql某个表中随机抽取10条记录
  1.通过MYSQL内置的函数来操作,具体SQL代码以下:
    SELECT * FROM tablename ORDER BY RAND() LIMIT 10
  2.不要将大量的工作给数据库去做,这样会致使数据库在某1集中并发时间内锁死并阻塞。建议通过PHP随机生成1下1-X(总行数)之间的数字,然后将这10个随机数字作为查询条件,具体语句如:
    SELECT * FROM tablename where ID in (2,8,4,11,12,9,3,1,33)
  可能你还要进行重复排除,并且需要在程序中将10个值串连并连接进入SQL语句中。

102 如何查看连接mysql确当前用户。

  show full processlist,在user字段中查看有哪些用户

103 写出mysql怎样修改密码?

  方法1: (适用于管理员或有全局权限的用户重设其它用户的密码)
    进入命令行模式
    mysql -u root -p
    mysql>use mysql;
    mysql> UPDATE user SET password=PASSWORD(“new password”) WHERE user=’username’;
    mysql> FLUSH PRIVILEGES;
    mysql> quit;
  方法2:
    mysql -u root -p
    mysql>use mysql;
    mysql> SET PASSWORD FOR username=PASSWORD(‘new password’);
    mysql> QUIT
  方法3:
    mysqladmin -u root “old password” “new password”
  注:new password请输入你想要设置的密码。

104 MySQL怎样修复破坏的表?

  有两种方法,1种方法使用mysql的check table和repair table 的sql语句,另外一种方法是使用MySQL提供的多个myisamchk, isamchk数据检测恢复工具。

105 简单叙述1下MYSQL的优化(重点)

  1.数据库的设计:尽可能把数据库设计的更小的占磁盘空间.
    1) 尽量使用更小的整数类型.(mediumint就比int更适合).
    2) 尽量的定义字段为not null,除非这个字段需要null.
    3) 如果没有用到变长字段的话比如varchar,那就采取固定大小的纪录格式比如char.
    4) 表的主索引应当尽量的短.这样的话每条纪录都着名字标志且更高效.
    5) 只创建确切需要的索引。索引有益于检索记录,但是不利于快速保存记录。如果总是要在表的组合字段上做搜索,那末就在这些字段上创建索引。索引的第1部份必须是最常使用的字段.如果总是需要用到很多字段,首先就应当多复制这些字段,使索引更好的紧缩。
    6) 所有数据都得在保存到数据库前进行处理。
    7) 所有字段都得有默许值。
    8) 在某些情况下,把1个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以获得相干记录时,它可能使用更小的静态格式表的情况下更是如此。
  2.系统的用处
    1) 尽可能使用长连接.
    2) explain复杂的SQL语句。
    3) 如果两个关联表要做比较话,做比较的字段必须类型和长度都1致.
    4) LIMIT语句尽可能要跟order by或 distinct.这样可以免做1次full table scan.
    5) 如果想要清空表的所有纪录,建议用truncate table tablename而不是delete from tablename.
    6) 能使用STORE PROCEDURE 或 USER FUNCTION的时候.
    7) 在1条insert语句中采取多重纪录插入格式.而且使用load data infile来导入大量数据,这比单纯的insert快好多.
    8) 常常OPTIMIZE TABLE 来整理碎片.
    9) 还有就是date 类型的数据如果频繁要做比较的话尽可能保存在unsigned int 类型比较快。
  3.系统的瓶颈
    1) 磁盘搜索。并行搜索,把数据分开寄存到多个磁盘中,这样能加快搜索时间.
    2) 磁盘读写(IO)。可以从多个媒介中并行的读取数据。
    3) CPU周期。数据寄存在主内存中.这样就得增加CPU的个数来处理这些数据。
    4) 内存带宽。当CPU要将更多的数据寄存到CPU的缓存中来的话,内存的带宽就成了瓶颈.

106 如何肯定有哪些存储引擎可用?

  mysql> show engines; 显示了可用的数据库引擎的全部名单和在当前的数据库服务器中是不是支持这些引擎。

107 MYSQL数据库设计数据类型选择需要注意哪些地方?(重点)

  VARCHAR和CHAR类型,varchar是变长的,需要额外的1⑵个字节存储,能节俭空间,可能会对性能有帮助。但由因而变长,可能产生碎片,如更新数据;
使用ENUM代替字符串类型,数据实际存储为整型。
  字符串类型
  要尽量地避免使用字符串来做标识符,由于它们占用了很多空间并且通常比整数类型要慢。特别注意不要在MYISAM表上使用字符串标识符。MYISAM默许情况下为字符串使用了紧缩索引(Packed Index),这使查找更加缓慢。据测试,使用了紧缩索引的MYISAM表性能要慢6倍。
  还要特别注意完全‘随机’的字符串,例如由MD5()、SHA1()、UUID()产生的。它们产生的每个新值都会被任意地保存在很大的空间范围内,这会减慢INSERT及1些SELECT查询。
    1)它们会减慢INSERT查询,由于插入的值会被随机地放入索引中。这会致使分页、随机磁盘访问及聚集存储引擎上的聚集索引碎片。
    2)它们会减慢SELECT查询,由于逻辑上相邻的行会散布在磁盘和内存中的各个地方。
    3)随机值致使缓存对所有类型的查询性能都很差,由于它们会使缓存赖以工作的访问局部性失效。如果全部数据集都变得一样“热”的时候,那末把特定部份的数据缓存到内存中就没有任何的优势了。并且如果工作集不能被装入内存中,缓存就会进行很多刷写的工作,并且会致使很多缓存未命中。
  如果保存UUID值,就应当移除其中的短横线,更好的办法是使用UHEX()把UUID值转化为16字节的数字,并把它保存在BINARY(16)列中。

108 mysql、oracle默许端口号

  3306、1521

109 innodb的事务与日志的实现方式。

  (1)有多少种日志
    毛病日志:记录出错信息,也记录1些正告信息或正确的信息
    慢查询日志:设置1个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
    2进制日志:记录对数据库履行更改的所有操作
    查询日志:记录所有对数据库要求的信息,不论这些要求是不是得到了正确的履行。
  (2)日志的寄存情势
  (3)事务是如何通过日志来实现的,说得越深入越好。
  在Innodb存储引擎中,事务日志是通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现 的,当开始1个事务的时候,会记录该事务的lsn(log sequence number)号; 当事务履行时,会往InnoDB存 储引擎的日志的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过 innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这类方式称为“预写日志方 式”, innodb通过此方式来保证事务的完全性。也就意味着磁盘上存储的数据页和内存缓冲池上面的页是不同步 的,是先写入redo log,然后写入data file,因此是1种异步的方式。
  隔离性: 通过锁实现
  原子性1致性持久性是通过redo和undo来完成的。

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生