mysql面試題

mysql筆試+面試題100題分享

?

轉(zhuǎn)載自:http://blog.51cto.com/wn2100/2049534

一.基礎(chǔ)筆試命令考察

?

1. ? ? ? 開啟MySQL服務(wù)

?

service mysqld start

?

/init.d/mysqld start

?

safe_mysql &

?

關(guān)閉mysql服務(wù)

?

service mysqld stop

?

/etc/init.d/mysqld stop

?

mysqladmin -uroot -p123456 shutdown

?

?

2. ? ? ? 檢測(cè)端口是否運(yùn)行

?

lsof -i:3306

?

netstat -tunlp|grep 3306

?

ss -tulnp|grep 3306

?

?

3. ? ? ? 為MySQL設(shè)置密碼或者修改密碼秤茅。

?

方法一

?

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數(shù)據(jù)庫(kù)焙蹭。

?

單實(shí)例登陸

?

mysql -uroot -p123456

?

多實(shí)例登陸

?

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

?

?

5. ? ? ? 查看當(dāng)前數(shù)據(jù)庫(kù)的字符集

?

mysql> show variables like "%charac%";

?

?

6. ? ? ? 查看當(dāng)前數(shù)據(jù)庫(kù)版本

?

# mysql -V

?

mysql> select version();

?

?

7. ? ? ? 查看當(dāng)前登錄的用戶。

?

mysql> select user();

?

?

查看T1數(shù)據(jù)庫(kù)中有哪兒些表

?

mysql> use T1;

?

mysql> show tables;

?

?

8. ? ? ? 創(chuàng)建GBK字符集的數(shù)據(jù)庫(kù)oldboy嫂伞,并查看已建庫(kù)完整語句

?

mysql> create database oldboy default character set gbk;

?

mysql> show create database oldboy;

?

?

9. ? ? ? 創(chuàng)建用戶oldboy孔厉,使之可以管理數(shù)據(jù)庫(kù)oldboy

?

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

?

?

10. ? 查看創(chuàng)建的用戶oldboy擁有哪些權(quán)限

?

mysql> show grants for oldboy@'localhost';

?

?

11. ? 查看當(dāng)前數(shù)據(jù)庫(kù)里有哪些用戶

?

mysql> select user,host from mysql.user;

?

?

12. ? 進(jìn)入oldboy數(shù)據(jù)庫(kù)

?

mysql> use oldboy();

?

?

13. ? 創(chuàng)建一個(gè)innodb GBK表test,字段id int(4)和name varchar(16)

?

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

?

?

14. ? 查看建表結(jié)構(gòu)及表結(jié)構(gòu)的SQL語句

?

mysql> desc test;

?

mysql> show create table test\G

?

?

15. ? 插入一條數(shù)據(jù)“1,oldboy”

?

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

?

?

16. ? 再批量插入2行數(shù)據(jù) “2,老男孩”帖努,“3,oldboyedu”

?

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

?

?

17. ? 查詢名字為oldboy的記錄

?

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

?

?

18. ? 把數(shù)據(jù)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. ? 不退出數(shù)據(jù)庫(kù),完成備份oldboy數(shù)據(jù)庫(kù)

?

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

?

?

21. ? 刪除test表中的所有數(shù)據(jù),并查看

?

mysql> delete from test;

?

?

22. ? 刪除表test和oldboy數(shù)據(jù)庫(kù)并查看

?

mysql> drop table test;

?

mysql> drop database oldboy;

?

?

23. ? 不退出數(shù)據(jù)庫(kù)恢復(fù)以上刪除的數(shù)據(jù)

?

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

?

?

24. ? 把庫(kù)表的GBK字符集修改為UTF8

?

mysql> alter database oldboy default character set utf8;

?

mysql> alter table test default character set utf8;

?

?

25. ? 把id列設(shè)置為主鍵拼余,在Name字段上創(chuàng)建普通索引污桦。

?

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后插入手機(jī)號(hào)字段(shouji),類型char(11)匙监。

?

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

?

?

27. ? 所有字段上插入2條記錄(自行設(shè)定數(shù)據(jù))

?

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. ? 在手機(jī)字段上對(duì)前8個(gè)字符創(chuàng)建普通索引

?

方法一:

?

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

?

方法二:

?

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

?

?

28.1 添加主鍵索引

?

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

?

?

29. ? 查看創(chuàng)建的索引及索引類型等信息凡橱。

?

mysql> show index from test\G

?

?

30. ? 刪除Name小作,shouji列的索引。

?

mysql> alter table test drop index index_name;

?

mysql> alter table test drop index index_shouji;

?

?

31. ? 對(duì)Name列的前6個(gè)字符以及手機(jī)列的前8個(gè)字符組建聯(lián)合索引稼钩。

?

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

?

?

32. ? 查詢手機(jī)號(hào)以135開頭的顾稀,名字為oldboy的記錄(提前插入)。

?

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

?

?

33. ? 查詢上述語句的執(zhí)行計(jì)劃(是否使用聯(lián)合索引等)坝撑。

?

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

?

?

34. ? 把test表的引擎改成MyISAM静秆。

?

mysql> alter table test engine=myisam; ? ? #myisam不區(qū)分大小寫

?

?

35. ? 收回oldboy用戶的select權(quán)限。

?

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

?

?

36. ? 刪除oldboy用戶巡李。

?

mysql> drop user oldboy@'localhost';

?

?

37. ? 刪除oldboy數(shù)據(jù)庫(kù)抚笔。

?

mysql> drop database oldboy;

?

?

38. ? 使用mysqladmin關(guān)閉數(shù)據(jù)庫(kù)。

?

mysqladmin -uroot -p123456 shutdown

?

?

39. ? MySQL密碼丟了侨拦,請(qǐng)找回殊橙?

?

# pkill mysql ? ? ? ? ? ? ? #先關(guān)閉mysql服務(wù)

?

#使用--skip-grant-tables啟動(dòng)mysql,忽略授權(quán)登陸驗(yàn)證

?

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

?

# mysql ? ? ? ? ? ? ? ? ? #此時(shí)再登陸狱从,已經(jīng)不需要密碼了

?

mysql> update mysql.user set password=password('abc123') where user='root' and host="localhost"; ? ? ? ? ?? #設(shè)置新的密碼

?

mysql> flush privileges;

?

# mysql -uroot -pabc123 ? ? #再次用新設(shè)置的密碼登陸即可

?

?

二.MySQL運(yùn)維基礎(chǔ)知識(shí)面試問答題

?

?? 40. ? 請(qǐng)解釋關(guān)系型數(shù)據(jù)庫(kù)概念及主要特點(diǎn)膨蛮?

?

概念:

?

關(guān)系型數(shù)據(jù)庫(kù)是支持采用了關(guān)系模型的數(shù)據(jù)庫(kù),簡(jiǎn)單來說矫夯,關(guān)系模型就是指二維表模型鸽疾,而一個(gè)關(guān)系數(shù)據(jù)庫(kù)就是由二維表及其之間的聯(lián)系所組成的一個(gè)數(shù)據(jù)組織吊洼。

?

特點(diǎn):

?

最大的特點(diǎn)就是事務(wù)的一致性训貌。

?

優(yōu)點(diǎn):容易理解、使用方便冒窍、易于維護(hù)递沪、支持SQL。

?

缺點(diǎn):

?

?? 高并發(fā)讀寫需求:網(wǎng)站的用戶并發(fā)非常高综液,往往達(dá)到每秒上萬次讀寫請(qǐng)求款慨,對(duì)于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)來說,硬盤I/O是一個(gè)很大的瓶頸谬莹。

?? 海量數(shù)據(jù)的高效讀寫:對(duì)于數(shù)據(jù)量巨大的網(wǎng)站來說檩奠,關(guān)系型數(shù)據(jù)庫(kù)的查詢效率非常低。

?? 固定的表結(jié)構(gòu)附帽。

?

?

?? 41. ? 請(qǐng)說出關(guān)系型數(shù)據(jù)庫(kù)的典型產(chǎn)品埠戳、特點(diǎn)及應(yīng)用場(chǎng)景?

?

1.SQLserver

?

特點(diǎn):真正的客戶機(jī)/服務(wù)器體系結(jié)構(gòu)

?

? ?? 圖形化用戶界面

?

? ?? 豐富的編程接口工具

?

? ?? 與Windows NT完全集成

?

? ?? 具有很好的伸縮性

?

應(yīng)用場(chǎng)景:

?

主機(jī)為Windows系統(tǒng)蕉扮,主要應(yīng)用于web網(wǎng)站的建設(shè)整胃,承載中小型web后臺(tái)數(shù)據(jù)。

?

2.MySQL

?

特點(diǎn):體積小喳钟,總擁有成本低屁使,開放源代碼在岂,可運(yùn)行在多數(shù)系統(tǒng)平臺(tái)上,輕量級(jí)易擴(kuò)展蛮寂。

?

應(yīng)用場(chǎng)景:廣泛的應(yīng)用在Internet上的中小型網(wǎng)站中蔽午。

?

3.Oracle

?

特點(diǎn):跨平臺(tái)運(yùn)行,安全性方面共郭,性能最高祠丝。對(duì)硬件要求高,價(jià)格昂貴除嘹。

?

應(yīng)用場(chǎng)景:大部分國(guó)企事業(yè)單位都用Oracle写半,在電信行業(yè)占用最大的份額。

?

?

?? 42. ? 請(qǐng)解釋非關(guān)系型數(shù)據(jù)庫(kù)概念及主要特點(diǎn)尉咕?

?? 使用鍵值對(duì)存儲(chǔ)數(shù)據(jù)叠蝇,且結(jié)構(gòu)不固定

?? 一般不支持ACID特性。

?? 基于鍵值對(duì)年缎,數(shù)據(jù)沒有耦合性悔捶,容易擴(kuò)展。

?? 不提供SQL支持单芜,學(xué)習(xí)和使用成本較高蜕该。

?

?

?? 43. ? 請(qǐng)說出非關(guān)系型數(shù)據(jù)庫(kù)的典型產(chǎn)品、特點(diǎn)及應(yīng)用場(chǎng)景洲鸠?

?

MongoDB

?

特點(diǎn):1.高性能堂淡,易部署,易使用扒腕。

?

? ?? 2.面向集合存儲(chǔ)绢淀,易存儲(chǔ)對(duì)象類型的數(shù)據(jù)。

?

? ?? 3.模式自由

?

? ?? 4.自動(dòng)處理碎片瘾腰,以支持云計(jì)算層次的擴(kuò)展性皆的。

?

應(yīng)用場(chǎng)景:

?

? ?? 網(wǎng)站數(shù)據(jù):mongodb非常適合實(shí)時(shí)的插入,更新與查詢蹋盆。

?

? ?? 緩存:適合作為信息基礎(chǔ)設(shè)施的緩存層

?

? ?? 大尺寸费薄、低價(jià)值的數(shù)據(jù)

?

? ?? 高伸縮性的場(chǎng)景

?

Redis

?

特點(diǎn):1.性能極高,能支持超過100k+每秒的讀寫頻率

?

? ?? 2.豐富的數(shù)據(jù)類型

?

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

?

使用場(chǎng)景:

?

? ?? 少量的數(shù)據(jù)存儲(chǔ)栖雾,高速讀寫訪問

?

SQLlite

?

特點(diǎn):

?

1.嵌入式的楞抡,零配置,無需安裝和管理配置

?

2.ACID事務(wù)

?

3.存儲(chǔ)在單一磁盤文件中的一個(gè)完整的數(shù)據(jù)庫(kù)岩灭。

?

應(yīng)用場(chǎng)景:

?

1.需要數(shù)據(jù)庫(kù)的小型桌面軟件拌倍。

?

2.需要數(shù)據(jù)庫(kù)的手機(jī)軟件。

?

3.作為數(shù)據(jù)容器的應(yīng)用場(chǎng)景。

?

?

?? 44. ? 請(qǐng)?jiān)敿?xì)描述SQL語句分類及對(duì)應(yīng)代表性關(guān)鍵字柱恤。

?

(1)DDL(Data Definition Language)---數(shù)據(jù)庫(kù)定義語言(create数初、alter、drop)梗顺,管理基礎(chǔ)數(shù)據(jù)庫(kù)泡孩,例如:庫(kù),表 ?

?

(2)DCL(Data Control Language)---數(shù)據(jù)控制語言(grant寺谤、revoke仑鸥、commit、rollback)变屁,用戶授權(quán)眼俊,權(quán)限回收,數(shù)據(jù)提交回滾等 ? ?

?

(3)DML(Data Manipulation Language)---數(shù)據(jù)操作語言(select粟关、insert疮胖、delete、update),針對(duì)數(shù)據(jù)庫(kù)里的表闷板,記錄 ?

?

?

?? 45. ? 請(qǐng)?jiān)敿?xì)描述char(4)和varchar(4)的差別澎灸。

?

char(4)定義的是固定長(zhǎng)度4,存儲(chǔ)時(shí)遮晚,如果字符數(shù)不夠4位性昭,會(huì)在后面用空格補(bǔ)全存入數(shù)據(jù)庫(kù)。

?

varchar(4)定義的是變長(zhǎng)長(zhǎng)度县遣,存儲(chǔ)時(shí)糜颠,如果字符沒有達(dá)到定義的位數(shù)4時(shí),也不會(huì)在后面補(bǔ)空格。

?

?

?? 46. ? 如何授權(quán)oldboy用戶從172.16.1.0/24訪問數(shù)據(jù)庫(kù)韭山。

?

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

?

?

?? 47. ? 什么是MySQL多實(shí)例,如何配置MySQL多實(shí)例?

?

在一臺(tái)服務(wù)器上蹋岩,mysql服務(wù)開啟多個(gè)不同的端口,運(yùn)行多個(gè)服務(wù)進(jìn)程云挟,這些mysql服務(wù)進(jìn)程通過不同的socket來監(jiān)聽不同的數(shù)據(jù)端口辫诅,進(jìn)而互不干涉的提供各自的服務(wù)。

?

?

?? 48. ? 如何加強(qiáng)MySQL安全箕速,請(qǐng)給出可行的具體措施酪碘?

?

1.避免直接從互聯(lián)網(wǎng)訪問mysql數(shù)據(jù)庫(kù),確保特定主機(jī)才擁有訪問權(quán)限盐茎。

?

2.定期備份數(shù)據(jù)庫(kù)

?

3.禁用或限制遠(yuǎn)程訪問

?

在my.cnf文件里設(shè)置bind-address指定ip

?

4.移除test數(shù)據(jù)庫(kù)(默認(rèn)匿名用戶可以訪問test數(shù)據(jù)庫(kù))

?

5.禁用local infile

?

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

?

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

?

6.移除匿名賬戶和廢棄的賬戶

?

7.限制mysql數(shù)據(jù)庫(kù)用戶的權(quán)限

?

8.移除和禁用.mysql_history文件

?

# cat ~/.mysql_history

?

# export MYSQL_HISTFILE=/dev/null

?

?

?? 49. ? delete和truncate刪除數(shù)據(jù)的區(qū)別兴垦?

?

truncate table test執(zhí)行更快,清空物理文件,清空表中的所有內(nèi)容

?

delete from test是邏輯刪除探越,按行刪除狡赐,而且可以通過where語句選擇要?jiǎng)h除的行

?

?

?? 50. ? MySQL Sleep線程過多如何解決?

?

mysql> show processlist\G

?

# mysqladmin -uroot -p123456 processlist

?

修改my.cnf文件里的wait_timeout的值钦幔,讓其更小一些枕屉,默認(rèn)wait_timeout =28800,這里改為100

?

mysql> set global wait_timeout=100;

?

mysql> show global variables like "wait_timeout";

?

?

?? 51. ? sort_buffer_size參數(shù)作用鲤氢?如何在線修改生效搀擂?

?

mysql執(zhí)行排序使用的緩沖大小。如果想要增加order by的速度卷玉,首先看是否可以讓mysql使用索引而不是額外的排序階段哨颂,如果不能,可以嘗試增加sort_buffer_size變量的大小相种。

?

mysql> set global sort_buffer_size =131072; ?? #單位為B咆蒿,即128KB,默認(rèn)64K

?

?

?? 52. ? 如何在線正確清理MySQL binlog蚂子?

?

自動(dòng)清除

?

mysql> set global expire_logs_days=30; ? #設(shè)置binlog過期時(shí)間為30天

?

手動(dòng)清除

?

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

?

?

?? 53. ? Binlog工作模式有哪些沃测?各什么特點(diǎn),企業(yè)如何選擇食茎?

?

1.row level行級(jí)模式

?

優(yōu)點(diǎn):記錄數(shù)據(jù)詳細(xì)(每行)蒂破,主從一致

?

缺點(diǎn):占用大量的磁盤空間,降低了磁盤的性能

?

2.statement level模式(默認(rèn))

?

優(yōu)點(diǎn):記錄的簡(jiǎn)單别渔,內(nèi)容少 附迷,節(jié)約了IO,提高性能 ?? 缺點(diǎn):導(dǎo)致主從不一致

?

3.MIXED混合模式

?

結(jié)合了statement和row模式的優(yōu)點(diǎn)哎媚,會(huì)根據(jù)執(zhí)行的每一條具體的SQL語句來區(qū)分對(duì)待記錄的日志形式喇伯。對(duì)于函數(shù),觸發(fā)器拨与,存儲(chǔ)過程會(huì)自動(dòng)使用row level模式

?

企業(yè)場(chǎng)景選擇:

?

1.互聯(lián)網(wǎng)公司使用mysql的功能較少(不用存儲(chǔ)過程稻据、觸發(fā)器、函數(shù))买喧,選擇默認(rèn)的statement模式捻悯。

?

2.用到mysql的特殊功能(存儲(chǔ)過程、觸發(fā)器淤毛、函數(shù))則選則MIXED模式

?

3.用到mysql的特殊功能(存儲(chǔ)過程今缚、觸發(fā)器、函數(shù))低淡,有希望數(shù)據(jù)最大化一致則選擇row模式姓言。

?

?

?? 54. ? 誤操作執(zhí)行了一個(gè)drop庫(kù)SQL語句瞬项,如何完整恢復(fù)?

?

如果條件允許何荚,操作前最好禁止外面一切服務(wù)器訪問mysql數(shù)據(jù)庫(kù)滥壕,這里假設(shè)禁止外面訪問數(shù)據(jù)庫(kù),具體步驟如下:

?

?? 手動(dòng)切割binlog日志并記好切割好的binlog日志文件位置兽泣,這里假設(shè)為009绎橘,備份全部binlog日志

?? 找到之前全備數(shù)據(jù)最后備份到的binlog文件位置并記好位置,這幾假設(shè)為005

?? 用mysqladmin命令將005到008binlog文件中的SQL語句分離出來唠倦,并找到drop庫(kù)的語句將其刪掉

?? 將之前全備數(shù)據(jù)導(dǎo)入mysql服務(wù)器

?? 將步驟3中分離出的SQL語句導(dǎo)入mysql服務(wù)器

?? 將009binlog文件刪除称鳞,再次刷新binlog日志,到此數(shù)據(jù)庫(kù)已恢復(fù)成功稠鼻。

?

?

?? 55. ? mysqldump備份使用了-A -B參數(shù)冈止,如何實(shí)現(xiàn)恢復(fù)單表?

?? 先用sed或awk將全庫(kù)中的需要的表結(jié)構(gòu)過濾出來

?

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

?

?? 再用grep將全庫(kù)中相應(yīng)的表內(nèi)容過濾出來

?

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

?

?? 將1和2中過濾出來的SQL語句導(dǎo)入數(shù)據(jù)庫(kù)即可

?

?

?? 詳述MySQL主從復(fù)制原理及配置主從的完整步驟候齿。

?

主從復(fù)制原理:

?


?

?? 主:binlog線程熙暴,記錄所有改變了數(shù)據(jù)庫(kù)數(shù)據(jù)的語句,放進(jìn)master上的binlog中

?? 從:IO線程慌盯,在使用start slave之后周霉,負(fù)責(zé)從master上拉取binlog內(nèi)容,放進(jìn)自己的relay log中

?? 從:SQL執(zhí)行線程亚皂,執(zhí)行relay log中的語句俱箱。

?

?

配置步驟:

?

?? 主庫(kù)開啟binlog日志功能

?? 全備數(shù)據(jù)庫(kù),記錄好binlog文件和相應(yīng)的位置

?? 從庫(kù)上配置和主庫(kù)的連接信息

?? 將全備數(shù)據(jù)導(dǎo)入從庫(kù)

?? 從庫(kù)啟動(dòng)slave

?? 在從庫(kù)上查看同步狀態(tài)灭必,確認(rèn)是否同步成功

?

?

?? 57. ? 如何開啟從庫(kù)的binlog功能狞谱?

?

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

?

?

?? 58. ? MySQL如何實(shí)現(xiàn)雙向互為主從復(fù)制,并說明應(yīng)用場(chǎng)景?

?

兩臺(tái)數(shù)據(jù)庫(kù)都開啟binlog功能禁漓,相互為主從配置跟衅。

?

雙主的實(shí)現(xiàn)方式主要有兩種:

?

?? 讓表的ID自增,然后主1寫1播歼、3伶跷、5,主2寫2荚恶、4撩穿、6

?? 不讓表的ID自增磷支,然后通過web端程序去seq服務(wù)器取ID谒撼,寫入雙主。

?

雙主工作場(chǎng)景為高并發(fā)寫的場(chǎng)景雾狈,慎用廓潜。

?

?

?? 59. ? MySQL如何實(shí)現(xiàn)級(jí)聯(lián)同步,并說明應(yīng)用場(chǎng)景?

?

第一臺(tái)數(shù)據(jù)庫(kù)開啟binlog功能設(shè)為主服務(wù)器,第二臺(tái)數(shù)據(jù)庫(kù)也開啟binlog功能辩蛋,設(shè)為第一臺(tái)服務(wù)器的從服務(wù)器呻畸,設(shè)為其他數(shù)據(jù)庫(kù)的主服務(wù)器

?

?

?? 60. ? MySQL主從復(fù)制故障如何解決?

?

解決辦法1:

?

登陸從庫(kù)上操作:

?

?? stop slave 臨時(shí)停止同步開關(guān)

?? set global sql_slave_skip_counter=1悼院,將同步指針向下移動(dòng)一個(gè)伤为,也可以多個(gè),如果多次不同步据途,可以重復(fù)操作绞愚。

?? start slave,重啟主從復(fù)制開關(guān)

?

解決辦法2:

?

在my.cnf配置文件中加入?yún)?shù)

?

slave-skip-errors=1032,1062,1007

?

?

?? 61. ? 如何監(jiān)控主從復(fù)制是否故障?

?

查看slave端的IO和SQL進(jìn)程狀態(tài)是否OK颖医,同步延遲時(shí)間是否小于1分鐘

?

mysql> show slave status\G

?

Slave_IO_Running: Yes

?

Slave_SQL_Running: Yes

?

Seconds_Behind_Master: 0

?

?

?? 62. ? MySQL數(shù)據(jù)庫(kù)如何實(shí)現(xiàn)讀寫分離位衩?

?? 通過程序?qū)崿F(xiàn)讀寫分離(性能,效率最佳熔萧,推薦

?

PHP和Java程序都可以通過設(shè)置多個(gè)連接文件輕松的實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的讀寫分離糖驴,即當(dāng)select時(shí),就去連接讀庫(kù)的連接文件佛致,當(dāng)update贮缕、insert、delete是就去連接寫庫(kù)的連接文件俺榆。

?

?? 通過軟件實(shí)現(xiàn)讀寫分離

?

MySQL-proxy,Amoeba等代理軟件也可以實(shí)現(xiàn)讀寫分離功能跷睦,但最常用最好用的還是程序?qū)崿F(xiàn)讀寫分離。

?

?? 開發(fā)dbproxy

?

?

?? 63. ? 生產(chǎn)一主多從從庫(kù)宕機(jī)肋演,如何手工恢復(fù)抑诸?

?

處理方法:重做slave

?

?? 停止slave

?? 導(dǎo)入備份數(shù)據(jù)

?? 配置master.info信息

?? 啟動(dòng)slave

?? 檢查從庫(kù)狀態(tài)

?

?

?? 64. ? 生產(chǎn)一主多從主庫(kù)宕機(jī),如何手工恢復(fù)爹殊?

?

主庫(kù)宕機(jī)分為數(shù)據(jù)庫(kù)宕機(jī)和服務(wù)器宕機(jī)2種蜕乡,不管哪種都要進(jìn)行主從切換。

?

1.登陸從庫(kù)檢查IO線程和SQL線程狀態(tài)show processlist\G梗夸,確認(rèn)SQL線程已讀完所有relay-log

?

2.登陸所有從庫(kù)檢查master.info信息层玲,查看哪個(gè)從庫(kù)的binlog文件和位置是最新的,選擇最新的從庫(kù)切換為主庫(kù)(或利用半同步功能反症,直接選擇做了實(shí)時(shí)同步的從庫(kù)為主庫(kù))

?

3.如果主庫(kù)只是數(shù)據(jù)庫(kù)宕了辛块,服務(wù)器還在運(yùn)行,則可以把binlog拉取到提升為主庫(kù)的從庫(kù)應(yīng)用铅碍。

?

4.登陸要切換為主庫(kù)的從庫(kù)润绵,進(jìn)行切換操作。

?

stop slave;reset master;quit

?

5.進(jìn)入要切換的從庫(kù)數(shù)據(jù)目錄胞谈,刪除master.info和relay-log.info文件尘盼,并檢查授權(quán)表憨愉,read_only等參數(shù)

?

6.修改my.cnf配置文件,開啟binlog卿捎,注釋從庫(kù)參數(shù)

?

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

?

#log-slave-updates

?

#read-only

?

?? 對(duì)同步用戶進(jìn)行提權(quán)配紫,保證權(quán)限與主庫(kù)用戶權(quán)限一樣

?? 重啟數(shù)據(jù)庫(kù)提生為主庫(kù)

?? 其他從庫(kù)操作

?

(1) ? ? ? 檢查運(yùn)行環(huán)境和用戶

?

(2) ? ? ? 停止從庫(kù),修改master信息

?

(3) ? ? ? 啟動(dòng)從庫(kù)同步午阵,檢查同步狀態(tài)

?

?? 修改web程序的連接配置躺孝,從原主庫(kù)指向新主庫(kù)

?? 維護(hù)損壞的主庫(kù),完成后作為從庫(kù)使用底桂,或切換回來

?? 如果主庫(kù)沒有宕機(jī)括细,只是想按計(jì)劃切換一下主庫(kù),就非常簡(jiǎn)單

?

(1) ? ? ? 主庫(kù)鎖表

?

(2) ? ? ? 登陸所有從庫(kù)檢查同步狀態(tài)戚啥,查看是否完成同步奋单。

?

(3) ? ? ? 其他按上面步驟進(jìn)行切換

?

?

?? 65. ? MySQL出現(xiàn)復(fù)制延遲有哪些原因?如何解決猫十?

?? 一個(gè)主庫(kù)的從庫(kù)太多览濒,導(dǎo)致復(fù)制延遲

?

建議從庫(kù)數(shù)量3-5個(gè)為宜,要復(fù)制的從節(jié)點(diǎn)數(shù)量過多拖云,會(huì)導(dǎo)致復(fù)制延遲

?

?? 從庫(kù)硬件比主庫(kù)差贷笛,導(dǎo)致復(fù)制延遲

?

查看master和slave的系統(tǒng)配置,可能會(huì)因?yàn)闄C(jī)器配置問題宙项,包括磁盤IO乏苦、CPU、內(nèi)存等各方面因素造成復(fù)制的延遲尤筐,一般發(fā)生在高并發(fā)大數(shù)據(jù)量的寫入場(chǎng)景汇荐。

?

?? 慢SQL語句過多

?

假如一條SQL語句執(zhí)行時(shí)間是20秒,那么執(zhí)行完畢到從庫(kù)上能查到數(shù)據(jù)也至少是20秒盆繁,可以修改后分多次寫入掀淘,通過查看慢查詢?nèi)罩净騭how full processlist命令找出執(zhí)行時(shí)間長(zhǎng)的查詢語句或者大的事務(wù)。

?

?? 主從復(fù)制設(shè)計(jì)問題

?

主從復(fù)制單線程油昂,如果主庫(kù)寫并發(fā)太大革娄,來不及傳送到從庫(kù)就會(huì)導(dǎo)致延遲。更高版本的mysql可以支持多線程復(fù)制冕碟,門戶網(wǎng)站則會(huì)自己開發(fā)多線程同步功能拦惋。

?

?? 主從庫(kù)之間網(wǎng)絡(luò)延遲

?

主從庫(kù)的網(wǎng)卡,網(wǎng)線安寺,連接的交換機(jī)等網(wǎng)絡(luò)設(shè)備都可能成為復(fù)制的瓶頸厕妖,導(dǎo)致復(fù)制延遲,另外我衬,跨公網(wǎng)主從復(fù)制很容易導(dǎo)致主從復(fù)制延遲叹放。

?

?? 主庫(kù)讀寫壓力大饰恕,導(dǎo)致復(fù)制延遲

?

主庫(kù)硬件要搞好一點(diǎn)挠羔,架構(gòu)的前端要加buffer井仰。

?

?

?? 66. ? 給出企業(yè)生產(chǎn)大型MySQL集群架構(gòu)可行備份方案?

?? 利用mysqldump做定時(shí)備份破加,根據(jù)情況可按天或按周做全庫(kù)備份俱恶。

?? 用rsync+inotify對(duì)主庫(kù)binlog做實(shí)時(shí)備份

?

?

?? 67. ? 什么是數(shù)據(jù)庫(kù)事務(wù),事務(wù)有哪些特性范舀?企業(yè)如何選擇合是?

?

事務(wù)就是指邏輯上的一組SQL語句操作,組成這組操作的各個(gè)SQL語句锭环,執(zhí)行時(shí)要么全成功要么全失敗聪全。

?

事務(wù)的四大特性(ACID):

?

?? 原子性(atomicity)

?

整個(gè)事務(wù)的所有操作,要么全部完成辅辩,要么全部不完成难礼,不可能停滯在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤玫锋,會(huì)被回滾(rollback)到事務(wù)開始前的狀態(tài)蛾茉,就像這個(gè)事務(wù)從來沒有執(zhí)行過一樣。

?

?? 一致性(consistency)

?

事務(wù)發(fā)生前和發(fā)生后撩鹿,數(shù)據(jù)的完整性必須保持一致

?

?? 隔離性(isolation)

?

當(dāng)并發(fā)訪問數(shù)據(jù)庫(kù)時(shí)谦炬,一個(gè)正在執(zhí)行的事務(wù)在執(zhí)行完畢前,對(duì)于其他的會(huì)話是不可見的节沦,多個(gè)并發(fā)事務(wù)之間的數(shù)據(jù)是相互隔離的键思。

?

?? 持久性(durability)

?

一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)改變就是永久性的甫贯,如果出了錯(cuò)誤稚机,事務(wù)也不允許撤銷。

?

?

?? 68. ? 請(qǐng)解釋全備获搏、增備赖条、冷備、熱備概念及企業(yè)實(shí)踐經(jīng)驗(yàn)常熙?

?

全備:備份數(shù)據(jù)庫(kù)所有數(shù)據(jù)

?

增備:一次性備份所有數(shù)據(jù)纬乍,然后再增量備份。

?

冷備:需要關(guān)閉mysql服務(wù)裸卫,讀寫請(qǐng)求均不允許狀態(tài)下進(jìn)行仿贬。

?

溫備:服務(wù)在線,但僅支持讀請(qǐng)求墓贿,不允許寫請(qǐng)求的情況下備份茧泪。

?

熱備:備份的同時(shí)蜓氨,業(yè)務(wù)不受影響。

?

?

?? 69. ? MySQL的SQL語句如何優(yōu)化队伟?

?? 在表中建立索引穴吹,優(yōu)先考慮where、group by使用到的字段

?? 盡量避免使用select *嗜侮,返回?zé)o用的字段會(huì)降低查詢效率

?? 盡量避免使用in和not in港令,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)引擎放棄索引進(jìn)行全表掃描

?? 盡量避免使用or,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)引擎放棄索引進(jìn)行全表掃描

?? 盡量避免在字段開頭模糊查詢锈颗,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)引擎放棄索引進(jìn)行全表掃描

?

?

?? 70. ? MySQL中MyISAM與InnoDB的區(qū)別顷霹,至少5點(diǎn)

?

(1) ? ? ? 問5點(diǎn)不同

?

?? InnoDB支持事務(wù),而MyISAM不支持事務(wù)击吱。

?? InnoDB支持行級(jí)鎖淋淀,而MyISAM支持表級(jí)鎖

?? InnoDB支持MVCC,而MyISAM不支持

?? InnoDB支持外鍵覆醇,而MyISAM不支持

?? InnoDB不支持全文索引朵纷,而MyISAM支持

?

(2) ? ? ? InnoDB引擎的3大特性

?

? 插入緩存(insert buffer)、二次寫(double write)叫乌、自適應(yīng)哈希索引(ahi)柴罐、預(yù)讀(read ahead)(3)二者select count(*)哪個(gè)更快,為什么憨奸?

?

? MyISAM更快革屠,因?yàn)镸yISAM內(nèi)部維護(hù)了一個(gè)計(jì)數(shù)器,可以直接調(diào)取排宰。

?

?

面試題035:開發(fā)有一堆數(shù)據(jù)發(fā)給dba執(zhí)行似芝,DBA執(zhí)行需注意什么?

?

?

?? 71. ? 如何調(diào)整生產(chǎn)線中MySQL數(shù)據(jù)庫(kù)的字符集板甘。

?? 修改my.cnf文件中的字符集配置

?? 查看當(dāng)前字符集設(shè)置

?

mysql> show global variables like "character%";

?

?? 用set分別設(shè)置字符集變量值

?

mysql> set global character_set_client=utf8;

?

mysql> set global character_set_connection=utf8;

?

mysql> set global character_set_results=utf8;

?

mysql> set global character_set_database;

?

mysql> set global character_set_server;

?

mysql> set global character_set_system;

?

?

?? 72. ? 請(qǐng)描述MySQL里中文數(shù)據(jù)亂碼原理撇吞,如何防止亂碼细睡?

?

mysql客戶端 mysql服務(wù)端 操作系統(tǒng)等字符集不一致導(dǎo)致的亂碼齿税,將上述字符集調(diào)成一致寓落。

?

?

?? 73. ? 企業(yè)生產(chǎn)MySQL如何優(yōu)化(請(qǐng)多角度描述)?

?? 硬件優(yōu)化

?

CPU在跳、內(nèi)存枪萄、磁盤、網(wǎng)卡

?

?? 軟件優(yōu)化

?

(1) ? ? ? 操作系統(tǒng):64位猫妙,內(nèi)核優(yōu)化

?

(2) ? ? ? MySQL編譯安裝瓷翻、優(yōu)化

?

?? my.cnf里的參數(shù)優(yōu)化

?

?

?? 74. ? MySQL高可用方案有哪些,各自特點(diǎn),企業(yè)如何選擇齐帚?

?? 主從復(fù)制+讀寫分離

?

優(yōu)點(diǎn):成本低妒牙、架構(gòu)簡(jiǎn)單、易實(shí)施对妄、維護(hù)方便

?

缺點(diǎn):master出現(xiàn)問題后不能自動(dòng)到slave上湘今,需要人工干涉。

?

?? MySQL Cluster

?

優(yōu)點(diǎn):安全性高饥伊,穩(wěn)定性高象浑∧枋危可以在線增加節(jié)點(diǎn)

?

缺點(diǎn):架構(gòu)復(fù)雜琅豆,至少三個(gè)節(jié)點(diǎn),對(duì)于引擎只能用ndb篓吁,不支持外鍵茫因,管理復(fù)雜,部署費(fèi)時(shí)而且是收費(fèi)的杖剪。

?

?? Heartbeat /keepalived+雙主從復(fù)制

?

優(yōu)點(diǎn):安全性冻押、穩(wěn)定性高,出現(xiàn)故障系統(tǒng)將自動(dòng)切換盛嘿,從而保證服務(wù)的連續(xù)性洛巢。

?

缺點(diǎn):可能會(huì)發(fā)生腦裂

?

?? HeartBeat+DRBD+MySQL

?

優(yōu)點(diǎn):安全性、穩(wěn)定性次兆、出現(xiàn)故障系統(tǒng)將自動(dòng)切換稿茉,從而保證服務(wù)的連續(xù)性。

?

缺點(diǎn):只用一臺(tái)服務(wù)器提供服務(wù)芥炭,成本高漓库,可能發(fā)生腦裂

?

?

?? 75. ? 如何分表分庫(kù)備份及批量恢復(fù)(口述腳本實(shí)現(xiàn)過程)?

?

備份庫(kù):

?

mysqldump -u 用戶名 -p 密碼 數(shù)據(jù)庫(kù)名? >備份的文件名

?

備份表

?

mysqldump -u 用戶名 -p 密碼 數(shù)據(jù)庫(kù)名 表名 >備份的文件名

?

面試題041:如何批量更改數(shù)據(jù)庫(kù)表的引擎园蝠?

?

#!/bin/sh

?

cmd="mysql -uroot -pabc123 -e"

?

$cmd "use 庫(kù)名;show tables;"|grep -v Tables >/file.txt ? #將表名存到file.txt文件里

?

tables=/file.txt

?

?

for n in `cat $tables` ?? #讓變量n分別取file.txt文件里的表名

?

do

?

? $cmd "use 庫(kù)名;alter table $n engine=myisam"

?

done

?

?

?? 如何批量更改數(shù)據(jù)庫(kù)字符集?

?

#!/bin/sh

?

cmd="mysql -uroot -pabc123 -e"

?

$cmd "show databases;"|grep -v Database >/file.txt

?

databases=/file.txt

?

?

for n in `cat $databases`

?

do

?

? $cmd "alter database $n default character set utf8;"

?

done

?

?

?? 77. ? 網(wǎng)站打開慢渺蒿,請(qǐng)給出排查方法,如是數(shù)據(jù)庫(kù)慢導(dǎo)致彪薛,如何排查并解決茂装,請(qǐng)分析并舉例?

?? 檢查操作系統(tǒng)是否負(fù)載過高

?? 登陸mysql查看有哪些sql語句占用時(shí)間過長(zhǎng)善延,show processlist;

?? 用explain查看消耗時(shí)間過長(zhǎng)的SQL語句是否走了索引

?? 對(duì)SQL語句優(yōu)化少态,建立索引

?

?

?? 78. ? xtranbackup的備份、增量備份及恢復(fù)的工作原理挚冤?

?

XtraBackup基于InnoDB的crash-recovery功能况增,它會(huì)復(fù)制InnoDB的data file,由于不鎖表训挡,復(fù)制出來的數(shù)據(jù)是不一致的澳骤,在恢復(fù)的時(shí)候使用crash-recovery歧强,使得數(shù)據(jù)恢復(fù)一致。

?

InnoDB維護(hù)了一個(gè)redo log为肮,又稱為transaction log(事務(wù)日志)摊册,它包含了InnoDB數(shù)據(jù)的所有改動(dòng)情況。當(dāng)InnoDB啟動(dòng)的時(shí)候颊艳,它會(huì)先去檢查data file和transaction log茅特,并且會(huì)做兩步操作:

?

XtraBackup在備份的時(shí)候,一頁(yè)一頁(yè)的復(fù)制InnoDB的數(shù)據(jù)棋枕,而且不鎖定表白修,與此同時(shí),XtraBackup還有另外一個(gè)線程監(jiān)視著transaction log重斑,一旦log發(fā)生變化兵睛,就把變化過的log pages復(fù)制走。為什么要著急復(fù)制走呢窥浪?因?yàn)閠ransaction log文件大小有限祖很,寫滿之后,就會(huì)從頭再開始寫漾脂,所以新數(shù)據(jù)可能會(huì)覆蓋到舊的數(shù)據(jù)假颇。

?

在prepare過程中,XtraBackup使用復(fù)制到的transaction log對(duì)備份出來的InnoDB data file進(jìn)行crash recovery

?

?

?? 79. ? 誤執(zhí)行drop數(shù)據(jù)骨稿,如何通過xtrabackup恢復(fù)笨鸡?

?? 關(guān)閉mysql服務(wù)

?? 移除mysql的data目錄及數(shù)據(jù)

?? 將備份的數(shù)據(jù)恢復(fù)到mysql的data目錄

?? 啟動(dòng)mysql服務(wù)

?

?

?? 如何做主從數(shù)據(jù)一致性校驗(yàn)?

?

主從一致性校驗(yàn)有多種工具 例如checksum啊终、mysqldiff镜豹、pt-table-checksum等

?

?

?? 81. ? 如何監(jiān)控MySQL的增刪改查次數(shù)?

?

mysql> show global status where variable_name in('com_select','com_insert','com_delete','com_update');

?

+---------------+-------+

?

| Variable_name | Value |

?

+---------------+-------+

?

| Com_delete ?? | 0 ? ? |

?

| Com_insert ?? | 0 ? ? |

?

| Com_select ?? | 31897 |

?

| Com_update ?? | 0 ? ? |

?

+---------------+-------+

?

4 rows in set (0.00 sec)

?

?

?? MySQL索引的種類及工作原理蓝牲。

?

普通索引:最基本的索引趟脂,沒有任何限制。

?

唯一索引:與普通索引類似例衍,不同的是昔期,索引列的值必須唯一,但允許有空值佛玄。

?

主鍵索引:它是一種特殊的唯一索引硼一,不允許有空值。一張表只能有一個(gè)主鍵梦抢。

?

組合索引:就是將多個(gè)字段建到一個(gè)索引里般贼。

?

?

?? 83. ? 如何自定義腳本啟動(dòng)MySQL(說出關(guān)鍵命令)

?

mysqld_safe? --defaults-file=/data/3306/my.cnf? &

?

?

?? 84. ? 如何自定義腳本平滑關(guān)閉MySQL(說出關(guān)鍵命令)

?

mysqladmin -u root-p123456 -S /data/3306/mysql.sock shutdown

?

?

?? 85. ? 你們的公司如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫分離的?

?

通過程序?qū)崿F(xiàn)的讀寫分離

?

insert、update哼蛆、delete蕊梧、alter等走主庫(kù),select等走從庫(kù)

?

?

?? mysqldump導(dǎo)入導(dǎo)出默認(rèn)把所有數(shù)據(jù)都縮減在一行里面腮介,為了查看和修改方便肥矢,如何將數(shù)據(jù)以多行插入的形式導(dǎo)出。

?

用--skip-extend-insert選項(xiàng)

?

?

?? 87. ? 你是如何監(jiān)控你能數(shù)據(jù)庫(kù)的叠洗?

?

開源監(jiān)控工具有很多甘改,如zabbix,nagios

?

Lepus(天兔):簡(jiǎn)潔灭抑、直觀十艾、強(qiáng)大的開源數(shù)據(jù)庫(kù)監(jiān)控系統(tǒng),MySQL/Oracle/MongoDB/Redis一站式性能監(jiān)控名挥,讓數(shù)據(jù)庫(kù)監(jiān)控更簡(jiǎn)單

?

?

?? 公司現(xiàn)有的數(shù)據(jù)庫(kù)架構(gòu)疟羹,總共有幾組mysql庫(kù)主守?

?

我們公司現(xiàn)在有兩組MySQL禀倔。其中一套是生產(chǎn)庫(kù),一套是測(cè)試庫(kù)参淫。

?

? 生產(chǎn)庫(kù)和測(cè)試庫(kù)都是用的mha +半同步復(fù)制做的高可用救湖。

? ? ? 我們所有的項(xiàng)目web前端量(大概有10個(gè)項(xiàng)目)指向的都是一個(gè)機(jī)器上的mysql實(shí)例。因?yàn)槲覀兪莻鹘y(tǒng)行業(yè)涎才,并發(fā)訪問量并不是很大鞋既,所以目前我們的生產(chǎn)mysql數(shù)據(jù)庫(kù)未出現(xiàn)性能問題。

?

?

?? mysql的權(quán)限怎么管理耍铜?

?? 只給insert,update邑闺,select和delete四個(gè)權(quán)限即可。有時(shí)候delete都不給棕兼。

?

?

90.? 如果發(fā)現(xiàn)CPU陡舅,或者IO壓力很大,怎么定位問題伴挚?

? 1靶衍、首先我會(huì)用top命令和iostat命令,定位是什么進(jìn)程在占用cpu和磁盤io茎芋;

? 2颅眶、如果是mysql的問題,我會(huì)登錄到數(shù)據(jù)庫(kù)田弥,通過show full processlist命令涛酗,看現(xiàn)在數(shù)據(jù)庫(kù)在執(zhí)行什么sql語句,是否有語句長(zhǎng)時(shí)間執(zhí)行使數(shù)據(jù)庫(kù)卡住商叹;

? 3眷蜈、執(zhí)行show engine innodb status\G命令,查看數(shù)據(jù)庫(kù)是否有鎖資源爭(zhēng)用沈自;

? 4酌儒、查看mysql慢查詢?nèi)罩荆词欠裼新齭ql枯途;

? 5忌怎、找到引起數(shù)據(jù)庫(kù)占用資源高的語句,進(jìn)行優(yōu)化酪夷,該建索引的建索引榴啸,索引不合適的刪索引,或者根據(jù)情況kill掉耗費(fèi)資源的sql語句等

第二套:

MySQL經(jīng)典面試題

1晚岭、MySQL的復(fù)制原理以及流程

?

(1)鸥印、復(fù)制基本原理流程

?

1. 主:binlog線程——記錄下所有改變了數(shù)據(jù)庫(kù)數(shù)據(jù)的語句,放進(jìn)master上的binlog中坦报;

2. 從:io線程——在使用start slave 之后库说,負(fù)責(zé)從master上拉取 binlog 內(nèi)容,放進(jìn) 自己的relay log中片择;

3. 從:sql執(zhí)行線程——執(zhí)行relay log中的語句潜的;

?

(2)、MySQL復(fù)制的線程有幾個(gè)及之間的關(guān)聯(lián)

?

MySQL 的復(fù)制是基于如下 3 個(gè)線程的交互( 多線程復(fù)制里面應(yīng)該是 4 類線程):

1. Master 上面的 binlog dump 線程字管,該線程負(fù)責(zé)將 master 的 binlog event 傳到slave啰挪;

2. Slave 上面的 IO 線程,該線程負(fù)責(zé)接收 Master 傳過來的 binlog嘲叔,并寫入 relay log亡呵;

3. Slave 上面的 SQL 線程,該線程負(fù)責(zé)讀取 relay log 并執(zhí)行硫戈;

4. 如果是多線程復(fù)制锰什,無論是 5.6 庫(kù)級(jí)別的假多線程還是 MariaDB 或者 5.7 的真正的多線程復(fù)制, SQL 線程只做 coordinator掏愁,只負(fù)責(zé)把 relay log 中的 binlog讀出來然后交給 worker 線程歇由, woker 線程負(fù)責(zé)具體 binlog event 的執(zhí)行;

?

(3)果港、MySQL如何保證復(fù)制過程中數(shù)據(jù)一致性及減少數(shù)據(jù)同步延時(shí)

?

一致性主要有以下幾個(gè)方面:

復(fù)制代碼

?

1.在 MySQL5.5 以及之前沦泌, slave 的 SQL 線程執(zhí)行的 relay log 的位置只能保存在文件( relay-log.info)里面,并且該文件默認(rèn)每執(zhí)行 10000 次事務(wù)做一次同步到磁盤辛掠, 這意味著 slave 意外 crash 重啟時(shí)谢谦, SQL 線程執(zhí)行到的位置和數(shù)據(jù)庫(kù)的數(shù)據(jù)是不一致的释牺,將導(dǎo)致復(fù)制報(bào)錯(cuò),如果不重搭復(fù)制回挽,則有可能會(huì)

導(dǎo)致數(shù)據(jù)不一致没咙。 MySQL 5.6 引入?yún)?shù) relay_log_info_repository,將該參數(shù)設(shè)置為 TABLE 時(shí)千劈, MySQL 將 SQL 線程執(zhí)行到的位置存到mysql.slave_relay_log_info 表祭刚,這樣更新該表的位置和 SQL 線程執(zhí)行的用戶事務(wù)綁定成一個(gè)事務(wù),這樣 slave 意外宕機(jī)后墙牌, slave 通過 innodb 的崩潰

恢復(fù)可以把 SQL 線程執(zhí)行到的位置和用戶事務(wù)恢復(fù)到一致性的狀態(tài)涡驮。

2. MySQL 5.6 引入 GTID 復(fù)制,每個(gè) GTID 對(duì)應(yīng)的事務(wù)在每個(gè)實(shí)例上面最多執(zhí)行一次喜滨, 這極大地提高了復(fù)制的數(shù)據(jù)一致性捉捅;

3. MySQL 5.5 引入半同步復(fù)制, 用戶安裝半同步復(fù)制插件并且開啟參數(shù)后虽风,設(shè)置超時(shí)時(shí)間棒口,可保證在超時(shí)時(shí)間內(nèi)如果 binlog 不傳到 slave 上面,那么用戶提交事務(wù)時(shí)不會(huì)返回辜膝,直到超時(shí)后切成異步復(fù)制无牵,但是如果切成異步之前用戶線程提交時(shí)在 master 上面等待的時(shí)候,事務(wù)已經(jīng)提交内舟,該事務(wù)對(duì) master

上面的其他 session 是可見的合敦,如果這時(shí) master 宕機(jī),那么到 slave 上面該事務(wù)又不可見了验游,該問題直到 5.7 才解決;

4. MySQL 5.7 引入無損半同步復(fù)制保檐,引入?yún)?rpl_semi_sync_master_wait_point耕蝉,該參數(shù)默認(rèn)為 after_sync,指的是在切成半同步之前夜只,事務(wù)不提交垒在,而是接收到 slave 的 ACK 確認(rèn)之后才提交該事務(wù),從此扔亥,復(fù)制真正可以做到無損的了场躯。

5.可以再說一下 5.7 的無損復(fù)制情況下, master 意外宕機(jī)旅挤,重啟后發(fā)現(xiàn)有 binlog沒傳到 slave 上面踢关,這部分 binlog 怎么辦?粘茄?签舞?分 2 種情況討論秕脓, 1 宕機(jī)時(shí)已經(jīng)切成異步了, 2 是宕機(jī)時(shí)還沒切成異步儒搭?吠架?? 這個(gè)怎么判斷宕機(jī)時(shí)有沒有切成異步呢搂鲫?傍药?? 分別怎么處理魂仍?怔檩??

?

復(fù)制代碼

?

延時(shí)性:

?

5.5 是單線程復(fù)制蓄诽, 5.6 是多庫(kù)復(fù)制(對(duì)于單庫(kù)或者單表的并發(fā)操作是沒用的)薛训, 5.7 是真正意義的多線程復(fù)制,它的原理是基于 group commit仑氛, 只要

master 上面的事務(wù)是 group commit 的乙埃,那 slave 上面也可以通過多個(gè) worker線程去并發(fā)執(zhí)行。 和 MairaDB10.0.0.5 引入多線程復(fù)制的原理基本一樣锯岖。

?

(4)介袜、工作遇到的復(fù)制 bug 的解決方法

?

5.6 的多庫(kù)復(fù)制有時(shí)候自己會(huì)停止,我們寫了一個(gè)腳本重新 start slave;待補(bǔ)充…

?

?

2出吹、MySQL中myisam與innodb的區(qū)別遇伞,至少5點(diǎn)

(1)、問5點(diǎn)不同

復(fù)制代碼

?

1.InnoDB支持事物捶牢,而MyISAM不支持事物

2.InnoDB支持行級(jí)鎖鸠珠,而MyISAM支持表級(jí)鎖

3.InnoDB支持MVCC, 而MyISAM不支持

4.InnoDB支持外鍵,而MyISAM不支持

5.InnoDB不支持全文索引秋麸,而MyISAM支持渐排。

6.InnoDB不能通過直接拷貝表文件的方法拷貝表到另外一臺(tái)機(jī)器, myisam 支持

7.InnoDB表支持多種行格式灸蟆, myisam 不支持

8.InnoDB是索引組織表驯耻, myisam 是堆表

?

復(fù)制代碼

?

(2)、innodb引擎的4大特性

?

1.插入緩沖(insert buffer)

2.二次寫(double write)

3.自適應(yīng)哈希索引(ahi)

4.預(yù)讀(read ahead)

?

(3)炒考、各種不同 mysql 版本的Innodb的改進(jìn)

復(fù)制代碼

?

MySQL5.6 下 Innodb 引擎的主要改進(jìn):

( 1) online DDL

( 2) memcached NoSQL 接口

( 3) transportable tablespace( alter table discard/import tablespace)

( 4) MySQL 正常關(guān)閉時(shí)可缚,可以 dump 出 buffer pool 的( space, page_no)斋枢,重啟時(shí) reload帘靡,加快預(yù)熱速度

( 5) 索引和表的統(tǒng)計(jì)信息持久化到 mysql.innodb_table_stats 和mysql.innodb_index_stats,可提供穩(wěn)定的執(zhí)行計(jì)劃

( 6) Compressed row format 支持壓縮表

?

MySQL 5.7 innodb 引擎主要改進(jìn)

( 1) 修改 varchar 字段長(zhǎng)度有時(shí)可以使用 online DDL

( 2) Buffer pool 支持在線改變大小

( 3) Buffer pool 支持導(dǎo)出部分比例

( 4) 支持新建 innodb tablespace杏慰,并可以在其中創(chuàng)建多張表

( 5) 磁盤臨時(shí)表采用 innodb 存儲(chǔ)测柠,并且存儲(chǔ)在 innodb temp tablespace 里面炼鞠,以前是 myisam 存儲(chǔ)

( 6) 透明表空間壓縮功能

?

復(fù)制代碼

?

(4)、2者select? count(*)哪個(gè)更快轰胁,為什么

?

myisam更快谒主,因?yàn)閙yisam內(nèi)部維護(hù)了一個(gè)計(jì)數(shù)器,可以直接調(diào)取赃阀。

?

(5)霎肯、2 者的索引的實(shí)現(xiàn)方式

?

都是 B+樹索引, Innodb 是索引組織表榛斯, myisam 是堆表观游, 索引組織表和堆表的區(qū)別要熟悉

?

?

3、MySQL中varchar與char的區(qū)別以及varchar(50)中的50代表的涵義

(1)驮俗、varchar與char的區(qū)別

?

在單字節(jié)字符集下懂缕, char( N) 在內(nèi)部存儲(chǔ)的時(shí)候總是定長(zhǎng), 而且沒有變長(zhǎng)字段長(zhǎng)度列表中王凑。 在多字節(jié)字符集下面搪柑, char(N)如果存儲(chǔ)的字節(jié)數(shù)超過 N,那么 char( N)將和 varchar( N)沒有區(qū)別索烹。在多字節(jié)字符集下面工碾,如果存

儲(chǔ)的字節(jié)數(shù)少于 N,那么存儲(chǔ) N 個(gè)字節(jié)百姓,后面補(bǔ)空格渊额,補(bǔ)到 N 字節(jié)長(zhǎng)度。 都存儲(chǔ)變長(zhǎng)的數(shù)據(jù)和變長(zhǎng)字段長(zhǎng)度列表垒拢。 varchar(N)無論是什么字節(jié)字符集旬迹,都是變長(zhǎng)的,即都存儲(chǔ)變長(zhǎng)數(shù)據(jù)和變長(zhǎng)字段長(zhǎng)度列表子库。

?

(2)舱权、varchar(50)中50的涵義

?

最多存放50個(gè)字符,varchar(50)和(200)存儲(chǔ)hello所占空間一樣仑嗅,但后者在排序時(shí)會(huì)消耗更多內(nèi)存,因?yàn)閛rder by col采用fixed_length計(jì)算col長(zhǎng)度(memory引擎也一樣)张症。在早期 MySQL 版本中仓技, 50 代表字節(jié)數(shù),現(xiàn)在代表字符數(shù)俗他。

?

(3)脖捻、int(20)中20的涵義

?

是指顯示字符的長(zhǎng)度

不影響內(nèi)部存儲(chǔ)冕杠,只是影響帶 zerofill 定義的 int 時(shí)淹辞,前面補(bǔ)多少個(gè) 0,易于報(bào)表展示

?

(4)嘉汰、mysql為什么這么設(shè)計(jì)

?

對(duì)大多數(shù)應(yīng)用沒有意義,只是規(guī)定一些工具用來顯示字符的個(gè)數(shù)摩疑;int(1)和int(20)存儲(chǔ)和計(jì)算均一樣危融;

?

4、innodb的事務(wù)與日志的實(shí)現(xiàn)方式

?

(1)雷袋、有多少種日志

?

redo和undo

?

(2)吉殃、日志的存放形式

?

redo:在頁(yè)修改的時(shí)候,先寫到 redo log buffer 里面楷怒, 然后寫到 redo log 的文件系統(tǒng)緩存里面(fwrite)蛋勺,然后再同步到磁盤文件( fsync)。

Undo:在 MySQL5.5 之前鸠删, undo 只能存放在 ibdata*文件里面抱完, 5.6 之后,可以通過設(shè)置 innodb_undo_tablespaces 參數(shù)把 undo log 存放在 ibdata*之外刃泡。

?

(3)巧娱、事務(wù)是如何通過日志來實(shí)現(xiàn)的,說得越深入越好

?

基本流程如下:

因?yàn)槭聞?wù)在修改頁(yè)時(shí)捅僵,要先記 undo家卖,在記 undo 之前要記 undo 的 redo, 然后修改數(shù)據(jù)頁(yè)庙楚,再記數(shù)據(jù)頁(yè)修改的 redo上荡。 Redo(里面包括 undo 的修改) 一定要比數(shù)據(jù)頁(yè)先持久化到磁盤。 當(dāng)事務(wù)需要回滾時(shí)馒闷,因?yàn)橛?undo酪捡,可以把數(shù)據(jù)頁(yè)回滾到前鏡像的

狀態(tài),崩潰恢復(fù)時(shí)纳账,如果 redo log 中事務(wù)沒有對(duì)應(yīng)的 commit 記錄逛薇,那么需要用 undo把該事務(wù)的修改回滾到事務(wù)開始之前。 如果有 commit 記錄疏虫,就用 redo 前滾到該事務(wù)完成時(shí)并提交掉永罚。

?

5、MySQL binlog的幾種日志錄入格式以及區(qū)別

?

(1)卧秘、 各種日志格式的涵義

復(fù)制代碼

?

1.Statement:每一條會(huì)修改數(shù)據(jù)的sql都會(huì)記錄在binlog中呢袱。

優(yōu)點(diǎn):不需要記錄每一行的變化,減少了binlog日志量翅敌,節(jié)約了IO羞福,提高性能。(相比row能節(jié)約多少性能 與日志量蚯涮,這個(gè)取決于應(yīng)用的SQL情況治专,正常同一條記錄修改或者插入row格式所產(chǎn)生的日志量還小于Statement產(chǎn)生的日志量卖陵,

但是考慮到如果帶條 件的update操作,以及整表刪除张峰,alter表等操作泪蔫,ROW格式會(huì)產(chǎn)生大量日志,因此在考慮是否使用ROW格式日志時(shí)應(yīng)該跟據(jù)應(yīng)用的實(shí)際情況挟炬,其所 產(chǎn)生的日志量會(huì)增加多少鸥滨,以及帶來的IO性能問題。)

缺點(diǎn):由于記錄的只是執(zhí)行語句谤祖,為了這些語句能在slave上正確運(yùn)行婿滓,因此還必須記錄每條語句在執(zhí)行的時(shí)候的 一些相關(guān)信息,以保證所有語句能在slave得到和在master端執(zhí)行時(shí)候相同 的結(jié)果粥喜。另外mysql 的復(fù)制,

像一些特定函數(shù)功能凸主,slave可與master上要保持一致會(huì)有很多相關(guān)問題(如sleep()函數(shù), last_insert_id()额湘,以及user-defined functions(udf)會(huì)出現(xiàn)問題).

使用以下函數(shù)的語句也無法被復(fù)制:

* LOAD_FILE()

* UUID()

* USER()

* FOUND_ROWS()

* SYSDATE() (除非啟動(dòng)時(shí)啟用了 --sysdate-is-now 選項(xiàng))

同時(shí)在INSERT ...SELECT 會(huì)產(chǎn)生比 RBR 更多的行級(jí)鎖

?

2.Row:不記錄sql語句上下文相關(guān)信息卿吐,僅保存哪條記錄被修改。

優(yōu)點(diǎn): binlog中可以不記錄執(zhí)行的sql語句的上下文相關(guān)的信息锋华,僅需要記錄那一條記錄被修改成什么了嗡官。所以rowlevel的日志內(nèi)容會(huì)非常清楚的記錄下 每一行數(shù)據(jù)修改的細(xì)節(jié)。而且不會(huì)出現(xiàn)某些特定情況下的存儲(chǔ)過程毯焕,或function衍腥,以及trigger的調(diào)用和觸發(fā)無法被正確復(fù)制的問題

缺點(diǎn):所有的執(zhí)行的語句當(dāng)記錄到日志中的時(shí)候,都將以每行記錄的修改來記錄纳猫,這樣可能會(huì)產(chǎn)生大量的日志內(nèi)容,比 如一條update語句婆咸,修改多條記錄,則binlog中每一條修改都會(huì)有記錄芜辕,這樣造成binlog日志量會(huì)很大尚骄,特別是當(dāng)執(zhí)行alter table之類的語句的時(shí)候,

由于表結(jié)構(gòu)修改侵续,每條記錄都發(fā)生改變倔丈,那么該表每一條記錄都會(huì)記錄到日志中。

?

3.Mixedlevel: 是以上兩種level的混合使用状蜗,一般的語句修改使用statment格式保存binlog乃沙,如一些函數(shù),statement無法完成主從復(fù)制的操作诗舰,則 采用row格式保存binlog,MySQL會(huì)根據(jù)執(zhí)行的每一條具體的sql語句來區(qū)分對(duì)待記錄的日志形式,

也就是在Statement和Row之間選擇 一種.新版本的MySQL中隊(duì)row level模式也被做了優(yōu)化训裆,并不是所有的修改都會(huì)以row level來記錄眶根,像遇到表結(jié)構(gòu)變更的時(shí)候就會(huì)以statement模式來記錄蜀铲。至于update或者delete等修改數(shù)據(jù)的語句,還是會(huì)記錄所有行的變更属百。

?

復(fù)制代碼

?

(2)记劝、適用場(chǎng)景

?

在一條 SQL 操作了多行數(shù)據(jù)時(shí), statement 更節(jié)省空間族扰, row 更占用空間厌丑。但是 row模式更可靠。

?

(3)渔呵、結(jié)合第一個(gè)問題怒竿,每一種日志格式在復(fù)制中的優(yōu)劣

?

Statement 可能占用空間會(huì)相對(duì)小一些,傳送到 slave 的時(shí)間可能也短扩氢,但是沒有 row模式的可靠耕驰。 Row 模式在操作多行數(shù)據(jù)時(shí)更占用空間, 但是可靠录豺。

?

6朦肘、下MySQL數(shù)據(jù)庫(kù)cpu飆升到500%的話他怎么處理?

?

當(dāng) cpu 飆升到 500%時(shí)双饥,先用操作系統(tǒng)命令 top 命令觀察是不是 mysqld 占用導(dǎo)致的媒抠,如果不是,找出占用高的進(jìn)程咏花,并進(jìn)行相關(guān)處理趴生。如果是 mysqld 造成的, show processlist迟螺,看看里面跑的 session 情況冲秽,是不是有消耗資源的 sql 在運(yùn)行。找出消耗高的 sql矩父,

看看執(zhí)行計(jì)劃是否準(zhǔn)確锉桑, index 是否缺失,或者實(shí)在是數(shù)據(jù)量太大造成窍株。一般來說民轴,肯定要 kill 掉這些線程(同時(shí)觀察 cpu 使用率是否下降),等進(jìn)行相應(yīng)的調(diào)整(比如說加索引球订、改 sql后裸、改內(nèi)存參數(shù))之后,再重新跑這些 SQL冒滩。也有可能是每個(gè) sql 消耗資源并不多微驶,但是突然之間,

有大量的 session 連進(jìn)來導(dǎo)致 cpu 飆升,這種情況就需要跟應(yīng)用一起來分析為何連接數(shù)會(huì)激增因苹,再做出相應(yīng)的調(diào)整苟耻,比如說限制連接數(shù)等

?

7、sql優(yōu)化

?

(1)扶檐、explain出來的各種item的意義

復(fù)制代碼

?

id:每個(gè)被獨(dú)立執(zhí)行的操作的標(biāo)志凶杖,表示對(duì)象被操作的順序。一般來說款筑, id 值大智蝠,先被執(zhí)行;如果 id 值相同奈梳,則順序從上到下杈湾。

select_type:查詢中每個(gè) select 子句的類型。

table:名字颈嚼,被操作的對(duì)象名稱毛秘,通常的表名(或者別名),但是也有其他格式阻课。

partitions:匹配的分區(qū)信息叫挟。

type:join 類型。

possible_keys:列出可能會(huì)用到的索引限煞。

key:實(shí)際用到的索引抹恳。

key_len:用到的索引鍵的平均長(zhǎng)度,單位為字節(jié)署驻。

ref:表示本行被操作的對(duì)象的參照對(duì)象奋献,可能是一個(gè)常量用 const 表示,也可能是其他表的

key 指向的對(duì)象旺上,比如說驅(qū)動(dòng)表的連接列瓶蚂。

rows:估計(jì)每次需要掃描的行數(shù)。

filtered:rows*filtered/100 表示該步驟最后得到的行數(shù)(估計(jì)值)宣吱。

extra:重要的補(bǔ)充信息窃这。

?

復(fù)制代碼

?

(2)、profile的意義以及使用場(chǎng)景

?

Profile 用來分析 sql 性能的消耗分布情況征候。當(dāng)用 explain 無法解決慢 SQL 的時(shí)候杭攻,需要用profile 來對(duì) sql 進(jìn)行更細(xì)致的分析,找出 sql 所花的時(shí)間大部分消耗在哪個(gè)部分疤坝,確認(rèn) sql的性能瓶頸兆解。

?

(3)、explain 中的索引問題

?

Explain 結(jié)果中跑揉,一般來說锅睛,要看到盡量用 index(type 為 const、 ref 等, key 列有值)衣撬,避免使用全表掃描(type 顯式為 ALL)乖订。比如說有 where 條件且選擇性不錯(cuò)的列,需要建立索引具练。

被驅(qū)動(dòng)表的連接列,也需要建立索引甜无。被驅(qū)動(dòng)表的連接列也可能會(huì)跟 where 條件列一起建立聯(lián)合索引扛点。當(dāng)有排序或者 group by 的需求時(shí),也可以考慮建立索引來達(dá)到直接排序和匯總的需求岂丘。

?

8陵究、備份計(jì)劃,mysqldump以及xtranbackup的實(shí)現(xiàn)原理

?

(1)奥帘、備份計(jì)劃

?

視庫(kù)的大小來定铜邮,一般來說 100G 內(nèi)的庫(kù),可以考慮使用 mysqldump 來做寨蹋,因?yàn)?mysqldump更加輕巧靈活松蒜,備份時(shí)間選在業(yè)務(wù)低峰期,可以每天進(jìn)行都進(jìn)行全量備份(mysqldump 備份

出來的文件比較小已旧,壓縮之后更小)秸苗。100G 以上的庫(kù),可以考慮用 xtranbackup 來做运褪,備份速度明顯要比 mysqldump 要快惊楼。一般是選擇一周一個(gè)全備,其余每天進(jìn)行增量備份秸讹,備份時(shí)間為業(yè)務(wù)低峰期檀咙。

?

(2)、備份恢復(fù)時(shí)間

復(fù)制代碼

?

物理備份恢復(fù)快璃诀,邏輯備份恢復(fù)慢

這里跟機(jī)器弧可,尤其是硬盤的速率有關(guān)系,以下列舉幾個(gè)僅供參考

20G的2分鐘(mysqldump)

80G的30分鐘(mysqldump)

111G的30分鐘(mysqldump)

288G的3小時(shí)(xtra)

3T的4小時(shí)(xtra)

邏輯導(dǎo)入時(shí)間一般是備份時(shí)間的5倍以上

?

復(fù)制代碼

?

(3)文虏、備份恢復(fù)失敗如何處理

?

首先在恢復(fù)之前就應(yīng)該做足準(zhǔn)備工作侣诺,避免恢復(fù)的時(shí)候出錯(cuò)。比如說備份之后的有效性檢查氧秘、權(quán)限檢查年鸳、空間檢查等。如果萬一報(bào)錯(cuò)丸相,再根據(jù)報(bào)錯(cuò)的提示來進(jìn)行相應(yīng)的調(diào)整搔确。

?

(4)、mysqldump和xtrabackup實(shí)現(xiàn)原理

?

mysqldump

?

mysqldump 屬于邏輯備份。加入--single-transaction 選項(xiàng)可以進(jìn)行一致性備份膳算。后臺(tái)進(jìn)程會(huì)先設(shè)置 session 的事務(wù)隔離級(jí)別為 RR(SET SESSION TRANSACTION ISOLATION LEVELREPEATABLE READ)座硕,

之后顯式開啟一個(gè)事務(wù)(START TRANSACTION /*!40100 WITH CONSISTENTSNAPSHOT */),這樣就保證了該事務(wù)里讀到的數(shù)據(jù)都是事務(wù)事務(wù)時(shí)候的快照涕蜂。之后再把表的數(shù)據(jù)讀取出來华匾。 如果加上--master-data=1 的話,在剛開始的時(shí)候還會(huì)加一個(gè)數(shù)據(jù)庫(kù)的讀鎖

(FLUSH TABLES WITH READ LOCK),等開啟事務(wù)后机隙,再記錄下數(shù)據(jù)庫(kù)此時(shí) binlog 的位置(showmaster status)蜘拉,馬上解鎖,再讀取表的數(shù)據(jù)有鹿。等所有的數(shù)據(jù)都已經(jīng)導(dǎo)完旭旭,就可以結(jié)束事務(wù)

?

Xtrabackup:

?

xtrabackup 屬于物理備份,直接拷貝表空間文件葱跋,同時(shí)不斷掃描產(chǎn)生的 redo 日志并保存下來持寄。最后完成 innodb 的備份后,會(huì)做一個(gè) flush engine logs 的操作(老版本在有 bug娱俺,在5.6 上不做此操作會(huì)丟數(shù)據(jù))稍味,確保所有的 redo log 都已經(jīng)落盤(涉及到事務(wù)的兩階段提交

概念,因?yàn)?xtrabackup 并不拷貝 binlog矢否,所以必須保證所有的 redo log 都落盤仲闽,否則可能會(huì)丟最后一組提交事務(wù)的數(shù)據(jù))。這個(gè)時(shí)間點(diǎn)就是 innodb 完成備份的時(shí)間點(diǎn)僵朗,數(shù)據(jù)文件雖然不是一致性的赖欣,但是有這段時(shí)間的 redo 就可以讓數(shù)據(jù)文件達(dá)到一致性(恢復(fù)的時(shí)候做的事

情)。然后還需要 flush tables with read lock验庙,把 myisam 等其他引擎的表給備份出來顶吮,備份完后解鎖。 這樣就做到了完美的熱備粪薛。

?

9悴了、mysqldump中備份出來的sql,如果我想sql文件中违寿,一行只有一個(gè)insert....value()的話湃交,怎么辦?如果備份需要帶上master的復(fù)制點(diǎn)信息怎么辦藤巢?

復(fù)制代碼

?

--skip-extended-insert

[root@helei-zhuanshu ~]# mysqldump -uroot -p helei --skip-extended-insert

Enter password:

? KEY `idx_c1` (`c1`),

? KEY `idx_c2` (`c2`)

) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=latin1;

/*!40101 SET character_set_client = @saved_cs_client */;

?

--

-- Dumping data for table `helei`

--

?

LOCK TABLES `helei` WRITE;

/*!40000 ALTER TABLE `helei` DISABLE KEYS */;

INSERT INTO `helei` VALUES (1,32,37,38,'2016-10-18 06:19:24','susususususususususususu');

INSERT INTO `helei` VALUES (2,37,46,21,'2016-10-18 06:19:24','susususususu');

INSERT INTO `helei` VALUES (3,21,5,14,'2016-10-18 06:19:24','susu');

?

復(fù)制代碼

?

10搞莺、500臺(tái)db,在最快時(shí)間之內(nèi)重啟

?

可以使用批量 ssh 工具 pssh 來對(duì)需要重啟的機(jī)器執(zhí)行重啟命令掂咒。 也可以使用 salt(前提是客戶端有安裝 salt)或者 ansible( ansible 只需要 ssh 免登通了就行)等多線程工具同時(shí)操作多臺(tái)服務(wù)器

?

11才沧、innodb的讀寫參數(shù)優(yōu)化

?

(1)迈喉、讀取參數(shù)

復(fù)制代碼

?

global buffer 以及 local buffer;

?

Global buffer:

Innodb_buffer_pool_size

innodb_log_buffer_size

innodb_additional_mem_pool_size

?

local buffer(下面的都是 server 層的 session 變量温圆,不是 innodb 的):

Read_buffer_size

Join_buffer_size

Sort_buffer_size

Key_buffer_size

Binlog_cache_size

?

復(fù)制代碼

?

(2)挨摸、寫入?yún)?shù)

?

innodb_flush_log_at_trx_commit

innodb_buffer_pool_size

insert_buffer_size

innodb_double_write

innodb_write_io_thread

innodb_flush_method

?

(3)、與IO相關(guān)的參數(shù)

復(fù)制代碼

?

innodb_write_io_threads = 8

innodb_read_io_threads = 8

innodb_thread_concurrency = 0

Sync_binlog

Innodb_flush_log_at_trx_commit

Innodb_lru_scan_depth

Innodb_io_capacity

Innodb_io_capacity_max

innodb_log_buffer_size

innodb_max_dirty_pages_pct

?

復(fù)制代碼

?

(4)岁歉、緩存參數(shù)以及緩存的適用場(chǎng)景

?

query cache/query_cache_type

并不是所有表都適合使用query cache得运。造成query cache失效的原因主要是相應(yīng)的table發(fā)生了變更

第一個(gè):讀操作多的話看看比例,簡(jiǎn)單來說刨裆,如果是用戶清單表澈圈,或者說是數(shù)據(jù)比例比較固定,比如說商品列表帆啃,是可以打開的,前提是這些庫(kù)比較集中窍帝,數(shù)據(jù)庫(kù)中的實(shí)務(wù)比較小努潘。

第二個(gè):我們“行騙”的時(shí)候,比如說我們競(jìng)標(biāo)的時(shí)候壓測(cè)坤学,把query cache打開疯坤,還是能收到qps激增的效果,當(dāng)然前提示前端的連接池什么的都配置一樣深浮。大部分情況下如果寫入的居多压怠,訪問量并不多,那么就不要打開飞苇,例如社交網(wǎng)站的菌瘫,10%的人產(chǎn)生內(nèi)容,其余的90%都在消費(fèi)布卡,打開還是效果很好的雨让,但是你如果是qq消息,或者聊天忿等,那就很要命栖忠。

第三個(gè):小網(wǎng)站或者沒有高并發(fā)的無所謂,高并發(fā)下贸街,會(huì)看到 很多 qcache 鎖 等待庵寞,所以一般高并發(fā)下,不建議打開query cache

?

12薛匪、你是如何監(jiān)控你們的數(shù)據(jù)庫(kù)的捐川?你們的慢日志都是怎么查詢的?

?

監(jiān)控的工具有很多蛋辈,例如zabbix属拾,lepus将谊,我這里用的是lepus

?

13、你是否做過主從一致性校驗(yàn)渐白,如果有尊浓,怎么做的,如果沒有纯衍,你打算怎么做栋齿?

?

主從一致性校驗(yàn)有多種工具 例如checksum、mysqldiff襟诸、pt-table-checksum等

?

14瓦堵、表中有大字段X(例如:text類型),且字段X不會(huì)經(jīng)常更新歌亲,以讀為為主菇用,請(qǐng)問您是選擇拆成子表,還是繼續(xù)放一起?寫出您這樣選擇的理由

?

答:拆帶來的問題:連接消耗 + 存儲(chǔ)拆分空間陷揪;不拆可能帶來的問題:查詢性能惋鸥;

如果能容忍拆分帶來的空間問題,拆的話最好和經(jīng)常要查詢的表的主鍵在物理結(jié)構(gòu)上放置在一起(分區(qū)) 順序IO,減少連接消耗,最后這是一個(gè)文本列再加上一個(gè)全文索引來盡量抵消連接消耗

如果能容忍不拆分帶來的查詢性能損失的話:上面的方案在某個(gè)極致條件下肯定會(huì)出現(xiàn)問題,那么不拆就是最好的選擇

?

15、MySQL中InnoDB引擎的行鎖是通過加在什么上完成(或稱實(shí)現(xiàn))的悍缠?為什么是這樣子的卦绣?

?

答:InnoDB是基于索引來完成行鎖

例: select * from tab_with_index where id = 1 for update;

for update 可以根據(jù)條件來完成行鎖鎖定,并且 id 是有索引鍵的列,

如果 id 不是索引鍵那么InnoDB將完成表鎖,,并發(fā)將無從談起

?

16、如何從mysqldump產(chǎn)生的全庫(kù)備份中只恢復(fù)某一個(gè)庫(kù)飞蚓、某一張表滤港?

復(fù)制代碼

?

全庫(kù)備份

[root@HE1 ~]# mysqldump -uroot -p --single-transaction -A --master-data=2 >dump.sql

只還原erp庫(kù)的內(nèi)容

[root@HE1 ~]# mysql -uroot -pMANAGER erp --one-database <dump.sql

?

可以看出這里主要用到的參數(shù)是--one-database簡(jiǎn)寫-o的參數(shù),極大方便了我們的恢復(fù)靈活性

那么如何從全庫(kù)備份中抽取某張表呢趴拧,全庫(kù)恢復(fù)溅漾,再恢復(fù)某張表小庫(kù)還可以,大庫(kù)就很麻煩了八堡,那我們可以利用正則表達(dá)式來進(jìn)行快速抽取樟凄,具體實(shí)現(xiàn)方法如下:

從全庫(kù)備份中抽取出t表的表結(jié)構(gòu)

[root@HE1 ~]# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `t`/!d;q' dump.sql

DROP TABLE IF EXISTS`t`;

/*!40101 SET@saved_cs_client ? ? =@@character_set_client */;

/*!40101 SETcharacter_set_client = utf8 */;

CREATE TABLE `t` (

? `id` int(10) NOT NULL AUTO_INCREMENT,

? `age` tinyint(4) NOT NULL DEFAULT '0',

? `name` varchar(30) NOT NULL DEFAULT '',

? PRIMARY KEY (`id`)

) ENGINE=InnoDBAUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*!40101 SETcharacter_set_client = @saved_cs_client */;

從全庫(kù)備份中抽取出t表的內(nèi)容

[root@HE1 ~]# grep'INSERT INTO `t`' dump.sql

INSERT INTO `t`VALUES (0,0,''),(1,0,'aa'),(2,0,'bbb'),(3,25,'helei');

?

復(fù)制代碼

?

17、在當(dāng)前的工作中兄渺,你碰到到的最大的 mysql db 問題以及如何解決的缝龄?

?

可以選擇一個(gè)處理過的比較棘手的案例,或者選擇一個(gè)老師在課程上講過的死鎖的案例;沒有及時(shí) Purge + insert 唯一索引造成的死鎖:具體案例可以參考學(xué)委筆記挂谍。

?

18叔壤、請(qǐng)簡(jiǎn)潔地描述下 MySQL 中 InnoDB 支持的四種事務(wù)隔離級(jí)別名稱,以及逐級(jí)之間的區(qū)別口叙?

?

(1)迎变、事物的4種隔離級(jí)別

?

讀未提交(read uncommitted)

讀已提交(read committed)

可重復(fù)讀(repeatable read)

串行(serializable)

?

(2)蕉世、不同級(jí)別的現(xiàn)象

?

Read Uncommitted:可以讀取其他 session 未提交的臟數(shù)據(jù)。

Read Committed:允許不可重復(fù)讀取粘昨,但不允許臟讀取笋熬。提交后,其他會(huì)話可以看到提交的數(shù)據(jù)。

Repeatable Read: 禁止不可重復(fù)讀取和臟讀取、以及幻讀(innodb 獨(dú)有)东且。

Serializable: 事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行本讥。事務(wù)隔離級(jí)別最高珊泳。

不同的隔離級(jí)別有不同的現(xiàn)象,并有不同的鎖定/并發(fā)機(jī)制拷沸,隔離級(jí)別越高色查,數(shù)據(jù)庫(kù)的并發(fā)性就越差。

?

?

面試中其他的問題:

1撞芍、2 年 MySQL DBA 經(jīng)驗(yàn)

復(fù)制代碼

?

其中許多有水分秧了,一看到簡(jiǎn)歷自我介紹,說公司項(xiàng)目的時(shí)候序无,會(huì)寫上 linux 系統(tǒng)維護(hù)示惊,mssql server 項(xiàng)目,或者 oracle data gard 項(xiàng)目愉镰,一般如果有這些的話,工作在 3 年到 4年的話钧汹,他的 2 年 MySQL DBA 管理經(jīng)驗(yàn)丈探,是有很大的水分的。剛開始我跟領(lǐng)導(dǎo)說拔莱,這些

不用去面試了碗降,肯定 mysql dba 經(jīng)驗(yàn)不足,領(lǐng)導(dǎo)說先面面看看塘秦,于是我就面了讼渊,結(jié)果很多人卡在基礎(chǔ)知識(shí)這一環(huán)節(jié)之上,比如:

( 1)有的卡在復(fù)制原理之上

( 2)有的卡在 binlog 的日志格式的種類和分別

( 3)有的卡在 innodb 事務(wù)與日志的實(shí)現(xiàn)上尊剔。

( 4)有的卡在 innodb 與 myisam 的索引實(shí)現(xiàn)方式的理解上面爪幻。

.........

個(gè)人覺得如果有過真正的 2 年 mysql 專職 dba 經(jīng)驗(yàn),那么肯定會(huì)在 mysql 的基本原理上有所研究须误,因?yàn)楹芏鄦栴}都不得不讓你去仔細(xì)研究各種細(xì)節(jié)挨稿,而自 己研究過的細(xì)節(jié)肯定會(huì)記憶深刻,別人問起一定會(huì)說的頭頭是道京痢,起碼一些最基本的關(guān)鍵參數(shù)比如

Seconds_Behind_Master 為 60 這個(gè)值 60 的準(zhǔn)確涵義奶甘,面試了 10+的 mysql dba,沒有一個(gè)說的準(zhǔn)確祭椰,有的說不知道忘記了臭家,有的說是差了 60 秒疲陕,有的說是與主上執(zhí)行時(shí)間延后了 60 秒。

?

復(fù)制代碼

2 钉赁、對(duì)于簡(jiǎn)歷中寫有熟悉 mysql 高可用方案

?

我一般先問他現(xiàn)在管理的數(shù)據(jù)庫(kù)架構(gòu)是什么蹄殃,如果他只說出了主從,而沒有說任何 ha的方案橄霉,那么我就可以判斷出他沒有實(shí)際的 ha 經(jīng)驗(yàn)窃爷。不過這時(shí)候也不能就是 斷定他不懂mysql 高可用,也許是沒有實(shí)際機(jī)會(huì)去使用姓蜂,那么我就要問 mmm 以及 mha 以及mm+keepalived 等的原理

實(shí)現(xiàn)方式以及它們之間的優(yōu) 勢(shì)和不足了按厘,一般這種情況下,能說出這個(gè)的基本沒有钱慢。mmm 那東西好像不靠譜逮京,據(jù)說不穩(wěn)定,但是有人在用的束莫,我只在虛擬機(jī)上面用過懒棉,和mysql-router 比較像,都是指定可寫的機(jī)器和只讀機(jī)器览绿。 MHA 的話一句話說不完策严,可以翻翻學(xué)委的筆記

?

3 、對(duì)于簡(jiǎn)歷中寫有批量 MySQL 數(shù)據(jù)庫(kù)服務(wù)器的管理經(jīng)驗(yàn)

?

這個(gè)如果他說有的話饿敲,我會(huì)先問他們現(xiàn)在實(shí)際線上的 mysql 數(shù)據(jù)庫(kù)數(shù)量有多少妻导,分多少個(gè)節(jié)點(diǎn)組,最后問這些節(jié)點(diǎn)組上面的 slow log 是如何組合在一起來統(tǒng)計(jì)分析的怀各。如果這些他都答對(duì)了倔韭,那么我還有一問,就是現(xiàn)在手上有 600 臺(tái)數(shù)據(jù)庫(kù)瓢对,新來的機(jī)器寿酌, Mysql 都

安裝好了,那么你如 何在最快的時(shí)間里面把這 600 臺(tái) mysql 數(shù)據(jù)庫(kù)的 mysqld 服務(wù)啟動(dòng)起來硕蛹。這個(gè)重點(diǎn)在于最快的時(shí)間醇疼,而能準(zhǔn)確回答出清晰思路的只有 2 個(gè)人。slow log 分析:可以通過一個(gè)管理服務(wù)器定時(shí)去各臺(tái) MySQL 服務(wù)器上面 mv 并且 cp slowlog妓美,

然后分析入庫(kù)僵腺,頁(yè)面展示。最快的時(shí)間里面啟動(dòng) 600 臺(tái)服務(wù)器: 肯定是多線程壶栋。 可以用 pssh辰如, ansible 等多線程批量管理服務(wù)器的工具

?

4 、對(duì)于有豐富的 SQL 優(yōu)化的經(jīng)驗(yàn)

?

首先問 mysql 中 sql 優(yōu)化的思路贵试,如果能準(zhǔn)備說出來琉兜, ok凯正,那么我就開始問 explain的各種參數(shù)了,重點(diǎn)是 select_type豌蟋, type廊散, possible_key, ref,rows,extra 等參數(shù)的各種

值的含義,如果他都回答正確了梧疲,那么我再問 file sort 的含義以及什么時(shí)候會(huì)出現(xiàn)這個(gè)分析結(jié)果允睹,如果這里他也回答對(duì)了,那么我就準(zhǔn)備問 profile 分析了幌氮,如果這里他也答對(duì)了缭受,那么我就會(huì)再問一個(gè)問 題,

那是曾經(jīng) tx 問我的讓我郁悶不已的問題该互,一個(gè) 6 億的表 a米者,一個(gè) 3 億的表 b,通過外間 tid 關(guān)聯(lián)宇智,你如何最快的查詢出滿足條件的第 50000 到第 50200中的這 200 條數(shù)據(jù)記錄蔓搞。

Explain 在上面的題目中有了,這里就不說了随橘。如何最快的查詢出滿足條件的第 50000 到第 50200 中的這 200 條數(shù)據(jù)記錄喂分?這個(gè)我想不出來!

關(guān)于 explain 的各種參數(shù)机蔗,請(qǐng)參考: http://blog.csdn.net/mchdba/article/details/9190771

?

5妻顶、對(duì)于有豐富的數(shù)據(jù)庫(kù)設(shè)計(jì)經(jīng)驗(yàn)

?

這個(gè)對(duì)于數(shù)據(jù)庫(kù)設(shè)計(jì)我真的沒有太多的經(jīng)驗(yàn),我也就只能問問最基礎(chǔ)的蜒车, mysql 中varchar(60) 60 是啥含義, int(30)中 30 是啥含義幔嗦? 如果他都回答對(duì)了酿愧,那么我就問 mysql中為什么要這么設(shè)計(jì)呢?

如果他還回答對(duì)了邀泉,我就繼續(xù)問 int(20)存儲(chǔ)的數(shù)字的上限和下限是多少嬉挡?這個(gè)問題難道了全部的 mysql dba 的應(yīng)聘者,不得不佩服提出這個(gè)問題的金總的睿智啊汇恤,因?yàn)檫@個(gè)問題回答正確了庞钢,

那么他確實(shí)認(rèn)認(rèn)真真地研究了 mysql 的設(shè)計(jì)中關(guān)于字段類型的細(xì)節(jié)。至 于豐富的設(shè)計(jì)數(shù)據(jù)庫(kù)的經(jīng)驗(yàn)因谎,不用著急基括,這不我上面還有更加厲害的 dba嗎,他會(huì)搞明白的财岔,那就跟我無關(guān)了风皿。

varchar(60)的 60 表示最多可以存儲(chǔ) 60 個(gè)字符河爹。int(30)的 30 表示客戶端顯示這個(gè)字段的寬度。

為何這么設(shè)計(jì)桐款?說不清楚咸这,請(qǐng)大家補(bǔ)充 。 int(20)的上限為 2147483647(signed)或者4294967295(unsigned)魔眨。

?

6 媳维、關(guān)于 mysql 參數(shù)優(yōu)化的經(jīng)驗(yàn)

復(fù)制代碼

?

首先問他它們線上 mysql 數(shù)據(jù)庫(kù)是怎么安裝的,如果說是 rpm 安裝的遏暴,那么我就直接問調(diào)優(yōu)參數(shù)了侄刽,如果是源碼安裝的,那么我就要問編譯中的一些參數(shù)了拓挥,比如 my.cnf 以及存儲(chǔ)引擎以及字符類型等等唠梨。然后從以下幾個(gè)方面問起:

( 1) mysql 有哪些 global 內(nèi)存參數(shù),有哪些 local 內(nèi)存參數(shù)侥啤。

Global:

innodb_buffer_pool_size/innodb_additional_mem_pool_size/innodb_log_buffer_size/key_buffer_size/query_cache_size/table_open_cache/table_definition_cache/thread_cache_size

Local:

read_buffer_size/read_rnd_buffer_size/sort_buffer_size/join_buffer_size/binlog_cache_size/tmp_table_size/thread_stack/bulk_insert_buffer_size

?

( 2) mysql 的寫入?yún)?shù)需要調(diào)整哪些当叭?重要的幾個(gè)寫參數(shù)的幾個(gè)值得含義以及適用場(chǎng)景,

比如 innodb_flush_log_at_trx_commit 等盖灸。 (求補(bǔ)充)

sync_binlog 設(shè)置為 1蚁鳖,保證 binlog 的安全性。

innodb_flush_log_at_trx_commit:

0:事務(wù)提交時(shí)不將 redo log buffer 寫入磁盤(僅每秒進(jìn)行 master thread 刷新赁炎,安全

性最差醉箕,性能最好)

1:事務(wù)提交時(shí)將 redo log buffer 寫入磁盤(安全性最好,性能最差徙垫, 推薦生產(chǎn)使用)

2:事務(wù)提交時(shí)僅將 redo log buffer 寫入操作系統(tǒng)緩存(安全性和性能都居中讥裤,當(dāng) mysql宕機(jī)但是操作系統(tǒng)不宕機(jī)則不丟數(shù)據(jù),如果操作系統(tǒng)宕機(jī)姻报,最多丟一秒數(shù)據(jù))

innodb_io_capacity/innodb_io_capacity_max:看磁盤的性能來定己英。如果是 HDD 可以設(shè)置為 200-幾百不等。如果是 SSD吴旋,推薦為 4000 左右损肛。 innodb_io_capacity_max 更大一些。

innodb_flush_method 設(shè)置為 O_DIRECT荣瑟。

?

( 3) 讀取的話治拿,那幾個(gè)全局的 pool 的值的設(shè)置,以及幾個(gè) local 的 buffer 的設(shè)置笆焰。

Global:

innodb_buffer_pool_size:設(shè)置為可用內(nèi)存的 50%-60%左右劫谅,如果不夠,再慢慢上調(diào)。

innodb_additional_mem_pool_size:采用默認(rèn)值 8M 即可同波。

innodb_log_buffer_size:默認(rèn)值 8M 即可鳄梅。

key_buffer_size:myisam 表需要的 buffer size,選擇基本都用 innodb未檩,所以采用默認(rèn)的 8M 即可戴尸。

Local:

join_buffer_size: 當(dāng) sql 有 BNL 和 BKA 的時(shí)候,需要用的 buffer_size(plain index

scans, range index scans 的時(shí)候可能也會(huì)用到)冤狡。默認(rèn)為 256k孙蒙,建議設(shè)置為 16M-32M。

read_rnd_buffer_size:當(dāng)使用 mrr 時(shí)悲雳,用到的 buffer挎峦。默認(rèn)為 256k,建議設(shè)置為16-32M合瓢。

read_buffer_size:當(dāng)順序掃描一個(gè) myisam 表坦胶,需要用到這個(gè) buffer∏缧ǎ或者用來決定memory table 的大小顿苇。或者所有的 engine 類型做如下操作:order by 的時(shí)候用 temporaryfile税弃、 SELECT INTO … OUTFILE 'filename' 纪岁、 For caching results of nested queries。默認(rèn)為 128K则果,建議為 16M幔翰。

sort_buffer_size: sql 語句用來進(jìn)行 sort 操作(order by,group by)的 buffer。如果 buffer 不夠西壮,則需要建立 temporary file遗增。如果在 show global status 中發(fā)現(xiàn)有大量的 Sort_merge_passes 值,則需要考慮調(diào)大 sort_buffer_size款青。默認(rèn)為 256k贡定,建議設(shè)置為 16-32M。

binlog_cache_size: 表示每個(gè) session 中存放 transaction 的 binlog 的 cache size可都。默認(rèn) 32K。一般使用默認(rèn)值即可蚓耽。如果有大事務(wù)渠牲,可以考慮調(diào)大。

thread_stack: 每個(gè)進(jìn)程都需要有步悠,默認(rèn)為 256K签杈,使用默認(rèn)值即可。

?

( 4) 還有就是著名的 query cache 了,以及 query cache 的適用場(chǎng)景了答姥,這里有一個(gè)陷阱铣除,

就是高并發(fā)的情況下,比如雙十一的時(shí)候鹦付, query cache 開還是不開尚粘,開了怎么保證高并發(fā),不開又有何別的考慮敲长?建議關(guān)閉郎嫁,上了性能反而更差。

?

復(fù)制代碼

7祈噪、關(guān)于熟悉 mysql 的鎖機(jī)制

?

gap 鎖泽铛, next-key 鎖,以及 innodb 的行鎖是怎么實(shí)現(xiàn)的辑鲤,以及 myisam 的鎖是怎么實(shí)現(xiàn)的等

Innodb 的鎖的策略為 next-key 鎖盔腔,即 record lock+gap lock。是通過在 index 上加 lock 實(shí)現(xiàn)的月褥,如果 index 為 unique index弛随,則降級(jí)為 record lock,如果是普通 index,則為 next-key lock吓坚,如果沒有 index撵幽,則直接鎖住全表。 myisam 直接使用全表掃描礁击。

?

8盐杂、 關(guān)于熟悉 mysql 集群的

?

我就問了 ndbd 的節(jié)點(diǎn)的啟動(dòng)先后順序,再問配置參數(shù)中的內(nèi)存配置幾個(gè)重要的參數(shù)哆窿,再問 sql 節(jié)點(diǎn)中執(zhí)行一個(gè) join 表的 select 語句的實(shí)現(xiàn)流程是怎么走的链烈? ok,能回答的也只有一個(gè)挚躯。

關(guān)于 mysql 集群入門資料强衡,請(qǐng)參考: http://write.blog.csdn.net/postlist/1583151/all

?

9、 關(guān)于有豐富的備份經(jīng)驗(yàn)的

復(fù)制代碼

?

就問 mysqldump 中備份出來的 sql码荔,如果我想 sql 文件中漩勤,一行只有一個(gè) insert .... value()的話,怎么辦缩搅?如果備份需要帶上 master 的復(fù)制點(diǎn)信息怎么辦越败?或者 xtrabackup 中如何

做到實(shí)時(shí)在線備份的?以及 xtrabackup 是如何做到帶上 master 的復(fù)制點(diǎn)的信息的硼瓣? 當(dāng)前 xtrabackup 做增量備份的時(shí)候有何缺陷究飞?能全部回答出來的沒有一個(gè),不過沒有關(guān)系,只要回答出 mysqldump 或者xtrabackup 其中一個(gè)的也可以亿傅。

1). --skip-extended-insert

2). --master-date=1

3). 因?yàn)?xtrabackup 是多線程媒峡,一個(gè)線程不停地在拷貝新產(chǎn)生的 redo 文件,另外的線程去備份數(shù)據(jù)庫(kù)葵擎,當(dāng)所有表空間備份完成的時(shí)候谅阿,它會(huì)執(zhí)行 flush table with read lock 操作

鎖住所有表,然后執(zhí)行 show master status; 接著執(zhí)行 flush engine logs; 最后解鎖表坪蚁。執(zhí)行 show master status; 時(shí)就能獲取到 mster 的復(fù)制點(diǎn)信息奔穿,執(zhí)行 flush engine logs 強(qiáng)制把redo 文件刷新到磁盤。

4). xtrabackup 增量備份的缺陷不了解敏晤,在線上用 xtrabackup 備份沒有發(fā)現(xiàn)什么缺陷贱田。

?

復(fù)制代碼

10 、關(guān)于有豐富的線上恢復(fù)經(jīng)驗(yàn)的

?

就問你現(xiàn)在線上數(shù)據(jù)量有多大嘴脾,如果是 100G男摧,你用 mysqldump 出來要多久,然后 mysql進(jìn)去又要多久译打,如果互聯(lián)網(wǎng)不允許延時(shí)的話耗拓,你又怎么做到 恢復(fù)單張表的時(shí)候保證 nagios不報(bào)警。如果有人說 mysqldump 出來 1 個(gè)小時(shí)就 ok 了奏司,那么我就要問問他 db 服務(wù)器是

啥配置了乔询,如果他說 mysql 進(jìn)去 50 分鐘搞定了,那么我也要問問他 db 機(jī)器啥配置了韵洋,如果是普通的吊絲 pc server竿刁,那么真實(shí)性,大家懂得搪缨。然后如果你用 xtrabackup 備份要多久食拜,恢復(fù)要多久,大家都知道 copy-back 這一步要很久副编,那么你有沒有辦法對(duì)這一塊優(yōu)化负甸。

14. 如果發(fā)現(xiàn)CPU,或者IO壓力很大痹届,怎么定位問題呻待?

?

答:

? 1、首先我會(huì)用top命令和iostat命令队腐,定位是什么進(jìn)程在占用cpu和磁盤io蚕捉;

? 2、如果是mysql的問題香到,我會(huì)登錄到數(shù)據(jù)庫(kù),通過show full processlist命令,看現(xiàn)在數(shù)據(jù)庫(kù)在執(zhí)行什么sql語句悠就,是否有語句長(zhǎng)時(shí)間執(zhí)行使數(shù)據(jù)庫(kù)卡浊鳌;

? 3梗脾、執(zhí)行show innodb engine status命令荸型,查看數(shù)據(jù)庫(kù)是否有鎖資源爭(zhēng)用;

? 4炸茧、查看mysql慢查詢?nèi)罩救鸶荆词欠裼新齭ql;

? 5梭冠、找到引起數(shù)據(jù)庫(kù)占用資源高的語句辕狰,進(jìn)行優(yōu)化,該建索引的建索引控漠,索引不合適的刪索引蔓倍,或者根據(jù)情況kill掉耗費(fèi)資源的sql語句等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盐捷,隨后出現(xiàn)的幾起案子偶翅,更是在濱河造成了極大的恐慌,老刑警劉巖碉渡,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聚谁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡滞诺,警方通過查閱死者的電腦和手機(jī)形导,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铭段,“玉大人骤宣,你說我怎么就攤上這事⌒蛴蓿” “怎么了憔披?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)爸吮。 經(jīng)常有香客問我芬膝,道長(zhǎng),這世上最難降的妖魔是什么形娇? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任锰霜,我火速辦了婚禮,結(jié)果婚禮上桐早,老公的妹妹穿的比我還像新娘癣缅。我一直安慰自己厨剪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布友存。 她就那樣靜靜地躺著祷膳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屡立。 梳的紋絲不亂的頭發(fā)上直晨,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音膨俐,去河邊找鬼勇皇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛焚刺,可吹牛的內(nèi)容都是我干的敛摘。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼檩坚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼着撩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匾委,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤拖叙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赂乐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薯鳍,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年挨措,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挖滤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浅役,死狀恐怖夺鲜,靈堂內(nèi)的尸體忽然破棺而出鹅搪,到底是詐尸還是另有隱情冈敛,我是刑警寧澤阀参,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站瞪讼,受9級(jí)特大地震影響钧椰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜符欠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一嫡霞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧希柿,春花似錦诊沪、人聲如沸养筒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闽颇。三九已至,卻和暖如春寄锐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尖啡。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工橄仆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衅斩。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓盆顾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親畏梆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子您宪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1宪巨、MySQL的復(fù)制原理以及流程 基本原理流程,3個(gè)線程以及之間的關(guān)聯(lián)溜畅; 主:binlog線程——記錄下所有改變了...
    皮皮塵啊閱讀 592評(píng)論 0 5
  • 開啟我的簡(jiǎn)書之旅!2018-10-02 MySQL經(jīng)典面試題目1捏卓、MySQL的復(fù)制原理以及流程基本原理流程,3個(gè)線...
    Dimplesya閱讀 498評(píng)論 0 3
  • 今天看到一位朋友寫的mysql筆記總結(jié)慈格,覺得寫的很詳細(xì)很用心怠晴,這里轉(zhuǎn)載一下,供大家參考下浴捆,也希望大家能關(guān)注他原文地...
    信仰與初衷閱讀 4,726評(píng)論 0 30
  • 小靜到了飯館蒜田,剛想去打掃衛(wèi)生時(shí),這時(shí)选泻,吳媽走了過來冲粤,說道,“小張今天沒來滔金,你替她一下吧色解!”這話音剛落,小靜就毫不猶...
    一個(gè)墮落的大學(xué)生閱讀 116評(píng)論 0 3
  • 永遠(yuǎn)別讓別人告訴你餐茵,你成不了才科阎,包括我也不行。如果你有夢(mèng)想的話忿族,就要去捍衛(wèi)它锣笨。那些一事無成的人才會(huì)想告訴你蝌矛,你也成...
    晚晚Ruby閱讀 68評(píng)論 0 1