zoukankan      html  css  js  c++  java
  • MySQL 常见面试知识点

    之前简单总结了一下MySQL的场景面试知识点

    1.讲下MVCC原理
    2.MySQL高可用架构介绍
    3.OSC(在线更改表结构)原理
    4.MySQL性能调优有哪些关键点/经验
    5.MySQL在线备份方案,Xtrabackup原理
    6.MySQL监控有哪些指标
    7.如何在线迁移MySQL
    8.MySQL 5.7有哪些新特性/功能
    9.Update t1 set c1=v1 where id=123; id是普通索引,该操作,会加哪些锁?
    10.空隙锁是解决什么问题的?
    11.服务器参数调优,有哪些关键点
    12.了解哪些中间件,对LVS,MHA的理解
    13.运维MySQL主从复制集群中,遇到过哪些问题,如何解决?
    14.运维MySQL过程中,遇到过什么重大故障,如何处理的?
    15. 数据库监控自动化方案
    16. innodb_autoinc_lock_mode#自增锁进发怎么设?设哪个参数,值多少,为什么?
    

    1 mvcc

    mysql数据库的多版本并发控制,对innodb引擎的表实现一致性的非锁定行读,如果读取当前的数据正在进行
    dml操作,读取操作不会等待行锁,innodb进行一个快照读,快照的版本是事务开始之前的版本,通过innodb的
    undo来实现,不同事务隔离级别,事务快照定义不一样。每一行存储版本号,每一个事务都会保存理解的版本号,
    依照事务的版本来检查每行的版本。
    

    2 mysql高可用架构

     a 双主keepalived,master-master,通过keepalived提供一个虚拟ip,并提供心跳检测脚本(ka_check_mysql.sh)
     ,如果脚本检测mysql失效, 则将该主机剔除keepalived
     b mha,manager节点,多个node,1个master,多个slave,mha可以进行自动切换,手工切换,由于mha可以保证
      多个日志进行合并,日志比对,将数据丢失到最小
     c lvs+keepalived+slave slave负载均衡  
    d pxc

    由于这个总结于2016年,现在应该加上MGR

    3 osc在线更改表结构

     mysql原生的在线ddl,copy和inplace
     --add index:copy,新建带index的表,锁原表,禁止dml,允许select,将原表数据拷贝到临时表,禁止读写,进行rename,升级字典锁,完成创建index操作
     --add index(second index): inplace,创建索引数据字典,加共享锁,禁止dml,允许select,读取聚簇索引,构造新的索引项,排序并插入新索引
        等待打开当前表的所有只读事务提交,创建结束
     第三方工具进行在线ddl,OAK,pt-online-ddl
     --oak,检查表是否符合oak-online-alter-table,没有fk,trigger,online ddl,数据一致性校验,表切换,rename,删除触发器
     --pt
    

    4 mysql性能调优

     --mysql 参数,
      --innodb_buffer_pool_size
      --innodb_thread_concurrency
      --innodb_io_capacity
      --innodb_flush_method
      --innodb_flush_log_at_trx_commit
      --sync_binlog
    

    5 mysql在线备份方案,xtrabackup

       a mysqldump,在线逻辑备份,导出成create,insert格式
       b xtrabackup,innobackupex 在线物理备份,以read-write模式打开innodb的数据文件,
        每次读写1mb的数据,一页一页的遍历,由于不锁表,所以复制出来的数据不一致,对于
    	myisam表,必须先锁表,然后复制文件
         --启动后台检测,实时检测mysql redo的变化,一旦redo写入,立刻将日志写入日志xtrabackup_log中
    	 --复制innodb的数据问候和系统表空间文件
    	 --复制结束,执行flush table with read lock
    	 --复制frm,myd,myi等文件
    	 --这一刻获得binary log的位置
    	 --unlock tables
    	 InnoDB 维护了一个 redo log,又称为 transaction log,事务日志,它包含了 innodb 数据
    	的所有改动情况。当 InnoDB 启动的时候,它会先去检查 data file 和 transaction log,并且会
    	做二步操作:
    	1.It applies committed transaction log entries to the data files
    	2.it performs an undo operation on any transactions that modified data but did not commit.
    

    6 mysql监控指标

      zabbix监控mysql,指标
        --cpu,processor load,memory,swap
        --qps,tps,mysqld
        --slave_io_running,slave_sql_running
    

    7 在线迁移mysql

        a 通过master-slave在线迁移,手动迁移
        b 通过mha,手工切换
        c pt-archive
    

    8 5.7新特性,功能

       a 安全性,初始化后没有密码为null的,密码修改策略,锁住用户等
       b 对json格式支持
         CREATE TABLE t_jeson (jdoc JSON);
         insert into t_jeson  VALUES('{"key1": "value1", "key2": "value2"}');
       c generate column
         CREATE TABLE triangle (sidea DOUBLE, sideb DOUBLE, area DOUBLE AS (sidea * sideb / 2));
       d 引入sys schema,系统库,包含一些视图,函数和过程
       e 在线开启GTID

    9.Update t1 set c1=v1 where id=123; id是普通索引,该操作,会加哪些锁

       a innodb表,RR模式下,首先通过id索引定位到第一条满足查询的记录,记录上加X锁,加GAP的gap锁,然后加聚簇索引记录上的x锁,然后返回
         ,然后读取下一条,重复进行,直至进行到第一条不满足条件的记录,此时不需要加x锁,仍需要加gap锁。
       b inndob表,RC模式下,对应所有满足sql查询条件的记录,都会被加锁,同时,这些记录在主键索引上的记录,也会被加锁  

    关于锁这一块,可以详细看一下mysql 45讲里面的锁讲解

    10.空隙锁是解决什么问题的?

    在RR模式下,innodb为了解决幻读,产生了gap锁 ,在同一个事务,连续两次当前读,返回的完全相同的记录。
    

    11.服务器参数调优,有哪些关键点

    	1 os系统选择,redhat,centos,suse
    	2 关闭swap,vm.swappiness=10
    	3 单实例mysql,关闭NUMA,os内核中设置,启动mysql时候关闭该参数
    	4 做双网卡,bond0,调整网络参数
    	5 磁盘调度设置
    	6 文件系统 推荐xfs/ext4 ,noatime,nobarrier   
    

    12.了解哪些中间件,对LVS,MHA的理解

       a mycat 中间件,可实现读写分离,主从自动切换,主要在分库分表
       b lvs 负载均衡,dr模式,选择路由方式,负责工作转派
       c mha  高可用架构,manager节点负责管理node,可用进行failover和手动切换主备库
    d dble
    e sharding-JDBC

    13.运维MySQL主从复制集群中,遇到过哪些问题,如何解决?

       集群问题:
       1 从库报错:1062 
    		stop slave;
    		delete from t1 where ename='robin';
    		start slave;   
    	2 1032 
    		stop slave sql_thread;
    		insert into t1 values(1,'linuxidc','http://www.linuxidc.com/linuxidc');
    		start slave sql_thread;
    	3 从库找不到对应的被删除的记录(Errno: 1032)
    		stop slave sql_thread;			
    		set gtid_next='1b64c25d-8d2b-11e6-9ac0-000c29b82d0d:92';	
    		begin;commit;
    		set gtid_next='AUTOMATIC';
    		start slave sql_thread;
    	4 主库binlog被purge的情形(Errno: 1236)
    		Last_IO_Error: Got fatal error 1236 from master when reading data from binary log:
    

    14.运维MySQL过程中,遇到过什么重大故障,如何处理的?

    15. 数据库监控自动化方案

    16. innodb_autoinc_lock_mode#自增锁进发怎么设?设哪个参数,值多少,为什么?  

      插入类型 
       insert-like=insert,replace,insert...select,replace...select,load data
       simple inserts=insert,replacce
       bulk inserts=insert...select,replace..select,load data
       mixed-mode inserts=insert into t1(c1,c2) values (1,'a'),(null,'b'),(5,'b'),(null,'d')
       innodb_autoinc_lock_mode=0,1,2
       1 默认值,对于simple inserts只用互斥量对内存中的计算器进行累加,对于bulk inserts,还是传统
         的auto-inc locking的方式,不考虑rollback,自增长还是连续的。
    	 如果使用auto-inc locking方式产生自增长的值,进行simple inserts时,需要等待auto-inc locking的释放
       2 所有的insert-like,自增长值的产生都是通过互斥两,而不是auto-inc locking方式,性能最高
         并发插入,每次插入,自增长的值可能不连续,使用该模式,主从要用row-base replication,保证
    	 最大的并发性能及复制中的主从数据的一致  

    上面大部分都偏一点理论知识的理解,其实还有很多的知识点没有列举

    在有的时候,面试官会比较关心:集群规模业务数据量业务类型等实际的问题

  • 相关阅读:
    深入探索 高效的Java异常处理框架
    Java多线程调试如何完成信息输出处理
    WebKit学习资源
    WebKit阅读起步
    Redis学习资源
    webkit在vs2008中编译
    【转】推荐几本学习MySQL的好书-MySQL 深入的书籍
    Mysql: 开启慢查询日志[ERROR] unknown variable 'log-slow-queries'处理办法
    Linux top命令详解
    eclipse svn同步过滤掉某些不需要同步的文件
  • 原文地址:https://www.cnblogs.com/yhq1314/p/11309597.html
Copyright © 2011-2022 走看看