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語句等