暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一周41个技术问题,来自社群的强烈推背感

102

今天统计了下,这一周,一共收集到41个技术问题

来源主要是我们创建的几个社群、DBA驿站星球、课程学员的提问,还不包括这周收集到的面试题。

然后还帮一位DBA体系课学员进行了一次模拟面试(课程学员免费),面试其实也是一次互相思考的过程。

也帮一位星友解答了他之前收集到的不太确定答案的16道面试题(这个解析已经放到DBA驿站星球里了)。


有一种感觉,有时候,是社群推着我在成长。

因为遇到的这些问题,自己有时候也有不太懂的,就需要去思考,查一些资料,感觉推着我去学习。

这也是标题说的,为什么推背感十足。


当然,对于DBA驿站这个社群,我们还是鼓励大家去提问或者帮星友解答的。

我们最近也增加了奖励措施,比如每周积分前三,获得星球分红奖励

在星球内回答问题,发布内容,都可以获取到积分。

让愿意创作的获得奖励,也能让其他星友看到更多内容。


以下就是这41个技术问题,解析不太对的,或者不完善的,也欢迎大家补充。其中第34题,还不确定答案,欢迎大佬帮忙解答。

1 想修改event_scheduler参数,要不要重启MySQL

这个参数是可以动态修改的,改完之后,再到配置文件里修改一下,这样就永久修改了。

对于参数是不是可以动态修改,

可以打开官网:

https://dev.mysql.com/doc/refman/8.0/en/

搜索对应的参数,然后看Dynamic字段,如果是Yes,就表示可以动态修改。


2 aws aurora MySQL同步到到华为MySQL,10T数据,如果不用DTS(省钱),还有哪些方案。

其实能用上云上的同步工具,会更方便。

比如阿里云的DTS、华为云的DRS。

关于费用问题,其实可以想办法省点钱,比如业务分批次迁移,迁移前一两天才同步。尽可能压缩云上同步工具的运行时间。


当然,其他方法,我能想到的就是Otter,这位朋友也想用OGG(这个小编就没玩过了)。

不过这些开源的同步工具,就复杂了,比如Otter,需要先同步全量,再找位点,配置增量同步。

关于Otter的玩法,小编之前也写过一篇文章:通过Otter同步MySQL数据


关于跨云迁移,小编之前做过AWS到阿里云的。

使用的是DTS,当时是通过API批量配置同步任务,相比开源工具,就方便很多了。只是有点费钱,哈哈。

不过迁移进某个云,这个云厂商的同步工具,是不是可以找商务聊一聊优惠一点,毕竟后面消费的地方还有很多。不然不迁了。


3 比如1亿行数据,使用Otter同步,存量的数据怎么先同步过去?

需要导出全量,mysqldump或者xtrabackup。


4  凌晨2点的备份,白天drop误操作了,怎么恢复数据

可以把Binlog导出成SQL,这个是增量数据,另外找台机器,导入全量,加增加的SQL。

也可以直接用全备+Binlog恢复

    mysqlbinlog --start-position=全备时的位点 --stop-position=误操作前的位点 mysql-bin.000091 | mysql -u root -p


    多个binlog文件就是

      mysqlbinlog --start-position=全备时的位点 --stop-position=误操作前的位点 mysql-bin.000091 mysql-bin.000092 | mysql -u root -p

      恢复之后需要业务确定下数据是否正常。

      更多数据恢复方法,可以看我之前写的系列文章:MySQL数据恢复


      5  Redis迁移工具有哪些(主从,集群架构)

      参考:这几天收集到的几个数据库实战问题


      6 Redis shake能针对 db(主从 或者  集群的 db0,db1,bd2)进行迁移吗

      参考:这几天收集到的几个数据库实战问题


      7 多个业务都需要 小容量的Redis,所以还是建议创建多个集群吗    而不是一个Redis集群分多个db

      参考:这几天收集到的几个数据库实战问题


      8 备份多个库一定要加-B吗?如果是,那么在备份了多个库后,要恢复时就不能指定库了吗?

      推荐是加上-B,恢复时不用指定库了。


      9 MySQL备份的文件和备份的日志不是一样的是吧?

      备份文件通常是指mysqldump或者xtrabackup备份出来的文件;

      备份日志通常是指备份的Binlog。


      10 备份文件记录的就是反向操作了?

      备份文件,如果是执行mysqldump备份出来的文件,里面是create table和insert语句。

      通过这些语句来进行数据恢复。

      在测试的时候,可以备份一份数据,然后查看一下这个文件看看。


      11 mysqldump远程备份存储在哪个位置呢?

      比如1机器有MySQL,在2上执行远程备份1上的数据,那备份文件就存放在2上。


      12 比如这里的备份文件在恢复时会执行蓝色部分注释的内容吗?

      /*! ... */ 中的部分,会执行的,这个不是注释,注释是--


      13 vim大文件卡主了怎么办?

      另外开一个连接:

        ps -ef|grep vim

        再把这个vim kill掉。


        14 备份文件里面如果有的表包含很多记录,那在备份文件中的insert语句也是一行一行添加是吗?

        一条insert,多行记录;

        试了一把,5114880行数据,出现了365个INSERT;

        也就是每条insert会包含一部分数据。


        15 MySQL,在恢复这段时间是不是不能让数据库有任何操作,或者说数据库就要上锁?

        是的,一般也建议在新的实例去恢复,确定没问题了,再导入老的实例。


        16 这里怎么确定没问题呢?是在新实例中检查一下误操作前的数据是否恢复了吗?

        可以让业务去校验,业务是能知道数据有没有正常恢复的。


        17 那通常都要准备一个实例专门用来给误操作恢复用的是吗?

        对,有条件是可以备一个。


        18 还有通常多大的误操作才需要恢复或者全备份恢复,是不是那些update,delete没带条件修改就算大误操作?

        这个算,还有更猛的,比如drop table,drop database


        19 备份的时候,我怎么知道位点,是不是以时间为界定的?我怎么知道误操作时的位点是多少?

        mysqldump 有个参数--master-data,会记录位点。

        如果将--master-data参数设置为1,则在备份文件中写入change replication source to语句或者change master to语句(恢复时会直接执行);

        如果--master-data=2,则会在备份文件中写入注释的change master语句。


        20 每天定时全备,是怎样实现的?

        写个脚本,把脚本加到Linux的定时任务里。


        21 那每天备份不是会占用很多存储空间,那是今天全备的覆盖昨天,不断循环吗?

        有些不放本地,放存储上,大存储没事,空间很大;

        实在不行,就把历史备份放到磁盘里,再把磁盘取出来,存放起来,我们称为刻盘。

        上面是对历史备份都有保留的情况。

        有些不需要保留这么久,那就保留7天左右的备份就行。


        22 把mysqldump导出的备份文件恢复到数据库里,报错:

        从库导入的时候需要先执行reset master;

        如果这个从库有复制关系,需要确定这个复制关系是否需要,如果不需要,就先停掉复制关系,再清空同步。


        23 比如:  恢复库recover1的t1表有(id:1,a:A),(id:2,a:B),备份文件(insert into t1(id,a) values (1,c);这里备份文件的数据是会往后增加还是将恢复库recover1的t1表的(id:1,a)更改为(id:1,a:c)

        新增数据,默认不会覆盖,你可以看下文件里的内容,其实就是insert语句,如果导入(恢复)到另外的实例,需要看有没有重复的主键或者唯一索引字段,有重复的,就会报错,没有就会导入成功,但不会覆盖。

        当然,假如想要备份文件里的数据覆盖恢复库的数据,mysqldump有个参数--replace,会用REPLACE INTO代替INSERT INTO


        24 mysqldump有个参数是刷新Binlog,这个有什么用?

        这样增量数据就是在一个新的Binlog里,恢复起来方便。

        除了备份,有时候迁移的时候,很多DBA也习惯刷新一次Binlog,也是未来恢复方便。

        开始的位点不用找了。


        25 现在企业一般都是将Linux系统装在虚拟机上吗?

        有些公司是用虚拟机,有些公司直接在服务器上安装Linux;

        操作系统这些一般其他人会搞定,不需要DBA去做。


        26 MySQL想要访问另一个实例数据库的数据,除了cdc同步,应用双连接方式外。有没有其他方式呀,有类似能实现oracle dblink一样的工具么

        【DBA驿站】星友的回答:

        1、dblink 本身设计是保证不了性能的;

        2、 遇到过这种问题,但没有办法,即使有方法实现 dblink 效果,性能也不会好;

        3、 这个需求和数据分布的设计是有分歧的,应该重新评估一下需求和设计。


        27 MySQL MVCC理解吗,一般会回答什么?

        之前写过一篇文章:一文搞懂MVCC

        面试的时候,能把第11点讲清楚,就差不多了。

        然后怕细问的话,可以把这篇文章看一遍。


        28 导入数据报错:

        可能这些原因:

        表的最大行大小 (innodb_page_size 参数)。

        行的最大大小 (innodb_large_prefix 参数)。


        innodb_strict_mode

        还有sql mode

        都对比下看看。


        最终这位同学确定了,是innodb_strict_mode主库关掉了,但是从库开启的。


        29 mysql -uroot -p </xx/xx.sql导数据好慢哈,40GB的数据量(部署主从的场景)

        最快的还是物理备份,比如xtrabackup,或者Clone。

        如果是mysqldump导出的,从库导入的时候,可以临时关闭双一。

        当然,逻辑备份还推荐一个多线程备份工具mydumper,比起mysqldump,备份和恢复都快很多。


        30 MySQL事务的持久性是通过redo log来实现的,对吧?

        是的,在事务提交时先将Redo Log刷盘(而非直接写数据文件),确保即使系统崩溃也能通过Redo Log恢复已提交事务的数据,从而保证持久性。


        31 redis-cluster进行扩容,万一失败了,怎么办?

        这个问题,星球里几位星友也讨论过。

        有朋友说不建议直接扩容,可以通过redis-shake的方式。直接扩容对slot的性能影响很大。

        也有朋友说redis-cluster扩容可以控制速度。


        这个题目,也许是考察redis-cluster迁移过程没有高可用的这个点,具体可以看这个链接:

        https://www.cnblogs.com/vivotech/p/18409723

        可能会导致数据脑裂。


        32 MHA是怎样实现的?如果发生故障,怎样保证快速转移?这个问题怎么准确回答?

        MHA确定主故障的原理

        通过一个死循环检测4次,每次休眠ping_interval秒,持续4次失败,就认为数据已经宕机

        检测方法包括:ping_select、ping_insert、ping_connect。

        如果有二路检测脚本,需要使用二路检测脚本检测到主库宕机才是真正的宕机,否则只是退出死循环,结束检测,不切换。

        MHA选主逻辑

        MHA在选择新主时,会将所有存活的从库分为以下几类。

        ● 存活节点组:所有存活的从节点。

        ● latest节点组:选取Binlog最近的从节点作为latest节点。

        ● 优选节点组:选取配置文件中指定了candidate_master=1的存活从节点。

        ● 劣质节点组:不参与选主的从节点(参数配置no_master=1节点);未开启Binlog的从节点;复制延迟超过一个文件位置或100 000 000个位点的从节点。

        选主顺序为从上至下依次筛选。

        (1)当优选节点组和劣质节点组的数量为0时,选主方式为latest节点组中的第一个从节点。

        (2)选择第一个属于latest节点组和优选节点组但不属于劣质节点组的从节点。

        (3)选择第一个属于优选节点组但不属于劣质节点组的从节点。

        (4)选择第一个属于latest节点组但不属于劣质节点组的从节点。

        (5)选择第一个属于存活节点组但不属于劣质节点组的从节点


        当然,对MHA原理感兴趣的,可以看一下马六学最近上线的专栏《HA源码解读:从原理到实战问题总结》(免费),地址:

        https://www.maliustudy.com/detail/column/312


        33 xtrabackup备份,哪些情况是加备份锁?哪些情况是加全局读锁?

        5.7及以前的版本,是没有备份锁的,所以加的是FLUSH TABLES WITH READ LOCK;

        但是8.0,考虑到全局读锁太重了,所以改成了备份锁:lock instance for backup。


        34 一张30个字段的表,怎么保证所有的插入数据中所有列不重复?

        感觉不像是考查添加联合唯一索引。有懂得朋友可以来聊一下。


        35 MySQL安装在容器里面,docker MySQL小版本升级,这个有风险吗,从mysql 8.0.35升级到8.0.41 。

        不太建议直接升级,万一怕遇到什么问题不好回滚。

        一般是新启动一个41的小版本,再从35做个同步到41,在业务低峰的时候,让研发改一下链接,配置到41上。

        会稳妥很多。


        36 请教 Redis、MongoDB、MySQL 较新版本的选择建议

        这个就是周二发布的文章素材来源。

        解析可跳转:如何选择MySQL、Redis、MongoDB版本?

        文章里,我增加了一个关于这几个数据库大家在使用的版本。

        记得去年还是5.7最多,今年已经是8.0用的最多了;

        然后就是MongoDB,没想到的是,多数是在使用4.0。


        37 物化视图和普通视图有什么区别?

        参考:这几天收集到的几个数据库实战问题


        38 请教 目前上线SQL审批都用的啥工具  Archery吗

        参考:这几天收集到的几个数据库实战问题


        39 华为云RDS慢日志实时展示是怎么实现的?

        参考:这几天收集到的几个数据库实战问题


        40 有个业务要迁移到云上,目前要hw了需要提前导出数据,目前只能本地导出,有什么高效稳定的办法导出吗?数据库28G,minio88G

        MySQL数据,感觉mysqldump就行;

        minio的数据,对应的云上,有他的对象存储,可以通过命令直接上传的,比如阿里云的OSS


        41 本地文件怎么传到Linux机器上?

          yum install lrzsz

          安装完之后,文件可以直接拖到xshell连接到的主机,你进到的是Linux哪个文件夹,传到的就是这个文件夹。


          好的,就是这些问题了。解析欢迎大家补充完善。

          文章转载自MySQL数据库联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论