軟件測試-Mysql面試題大全

一.基礎(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. ****檢測端口是否運行

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ù)庫涮较。

單實例登陸

mysql -uroot -p123456

多實例登陸

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

5. ****查看當前數(shù)據(jù)庫的字符集

mysql> show variables like "%charac%";

6. ****查看當前數(shù)據(jù)庫版本

mysql -V

mysql> select version();

7. ****查看當前登錄的用戶价捧。

mysql> select user();

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

mysql> use T1;

mysql> show tables;

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

mysql> create database oldboy default character set gbk;

mysql> show create database oldboy;

9. ****創(chuàng)建用戶oldboy****庆猫,使之可以管理數(shù)據(jù)庫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. ****查看當前數(shù)據(jù)庫里有哪些用戶

mysql> select user,host from mysql.user;

12. ****進入oldboy****數(shù)據(jù)庫

mysql> use oldboy();

13. ****創(chuàng)建一個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ù)庫,****完成備份oldboy****數(shù)據(jù)庫

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ù)庫并查看

mysql> drop table test;

mysql> drop database oldboy;

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

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

24. ****把庫表的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****后插入手機號字段(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. ****在手機字段上對前8****個字符創(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. ****對Name****列的前6****個字符以及手機列的前8****個字符組建聯(lián)合索引。

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

32. ****查詢手機號以135****開頭的咐旧,名字為oldboy****的記錄(提前插入)驶鹉。

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

33. ****查詢上述語句的執(zhí)行計劃(是否使用聯(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ù)庫伊约。

mysql> drop database oldboy;

38. ****使用mysqladmin****關(guān)閉數(shù)據(jù)庫姚淆。

mysqladmin -uroot -p123456 shutdown

39. ****MySQL****密碼丟了,請找回屡律?

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

使用--skip-grant-tables啟動mysql腌逢,忽略授權(quán)登陸驗證

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

mysql #此時再登陸,已經(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運維基礎(chǔ)知識面試問答題

  1. 40. ****請解釋關(guān)系型數(shù)據(jù)庫概念及主要特點超埋?

概念:

關(guān)系型數(shù)據(jù)庫是支持采用了關(guān)系模型的數(shù)據(jù)庫搏讶,簡單來說佳鳖,關(guān)系模型就是指二維表模型,而一個關(guān)系數(shù)據(jù)庫就是由二維表及其之間的聯(lián)系所組成的一個數(shù)據(jù)組織媒惕。

特點:

最大的特點就是事務(wù)的一致性系吩。

優(yōu)點:容易理解、使用方便妒蔚、易于維護穿挨、支持SQL。

缺點:

  1. 高并發(fā)讀寫需求:網(wǎng)站的用戶并發(fā)非常高面睛,往往達到每秒上萬次讀寫請求絮蒿,對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫來說,硬盤I/O是一個很大的瓶頸叁鉴。

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

  3. 固定的表結(jié)構(gòu)幌墓。

  4. 41. ****請說出關(guān)系型數(shù)據(jù)庫的典型產(chǎn)品、特點及應(yīng)用場景冀泻?

1.SQLserver

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

  圖形化用戶界面

  豐富的編程接口工具

  與Windows NT完全集成

  具有很好的伸縮性

應(yīng)用場景:

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

2.MySQL

特點:體積小胳施,總擁有成本低,開放源代碼肢专,可運行在多數(shù)系統(tǒng)平臺上舞肆,輕量級易擴展。

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

3.Oracle

特點:跨平臺運行椿胯,安全性方面,性能最高剃根。對硬件要求高哩盲,價格昂貴。

應(yīng)用場景:大部分國企事業(yè)單位都用Oracle狈醉,在電信行業(yè)占用最大的份額廉油。

  1. 42. ****請解釋非關(guān)系型數(shù)據(jù)庫概念及主要特點?

  2. 使用鍵值對存儲數(shù)據(jù)苗傅,且結(jié)構(gòu)不固定

  3. 一般不支持ACID特性抒线。

  4. 基于鍵值對,數(shù)據(jù)沒有耦合性金吗,容易擴展十兢。

  5. 不提供SQL支持趣竣,學習和使用成本較高。

  6. 43. ****請說出非關(guān)系型數(shù)據(jù)庫的典型產(chǎn)品旱物、特點及應(yīng)用場景遥缕?

MongoDB

特點:1.高性能,易部署宵呛,易使用单匣。

  2.面向集合存儲,易存儲對象類型的數(shù)據(jù)宝穗。

  3.模式自由

  4.自動處理碎片户秤,以支持云計算層次的擴展性。

應(yīng)用場景:

  網(wǎng)站數(shù)據(jù):mongodb非常適合實時的插入逮矛,更新與查詢鸡号。

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

  大尺寸、低價值的數(shù)據(jù)

  高伸縮性的場景

Redis

特點:1.性能極高须鼎,能支持超過100k+每秒的讀寫頻率

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

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

使用場景:

  少量的數(shù)據(jù)存儲鲸伴,高速讀寫訪問

SQLlite

特點:

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

2.ACID事務(wù)

3.存儲在單一磁盤文件中的一個完整的數(shù)據(jù)庫汞窗。

應(yīng)用場景:

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

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

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

  1. 44. ****請詳細描述SQL****語句分類****及對應(yīng)代表性關(guān)鍵字。

(1)DDL(Data Definition Language)---數(shù)據(jù)庫定義語言(create蝌焚、alter裹唆、drop),管理基礎(chǔ)數(shù)據(jù)庫综看,例如:庫品腹,表

(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),針對數(shù)據(jù)庫里的表,記錄

  1. 45. ****請詳細描述char(4)****和varchar(4)****的差別奕剃。

char(4)定義的是固定長度4衷旅,存儲時捐腿,如果字符數(shù)不夠4位,會在后面用空格補全存入數(shù)據(jù)庫柿顶。

varchar(4)定義的是變長長度茄袖,存儲時,如果字符沒有達到定義的位數(shù)4時嘁锯,也不會在后面補空格宪祥。

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

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

  1. 47. ****什么是MySQL****多實例家乘,如何配置MySQL****多實例蝗羊?

在一臺服務(wù)器上,mysql服務(wù)開啟多個不同的端口仁锯,運行多個服務(wù)進程耀找,這些mysql服務(wù)進程通過不同的socket來監(jiān)聽不同的數(shù)據(jù)端口,進而互不干涉的提供各自的服務(wù)业崖。

  1. 48. ****如何加強MySQL****安全涯呻,請給出可行的具體措施?

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

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

3.禁用或限制遠程訪問

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

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

5.禁用local infile

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

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

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

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

8.移除和禁用.mysql_history文件

cat ~/.mysql_history

export MYSQL_HISTFILE=/dev/null

  1. 49. ****delete****和truncate****刪除數(shù)據(jù)的區(qū)別****涝登?

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

delete from test是邏輯刪除胀滚,按行刪除趟济,而且可以通過where語句選擇要刪除的行

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

mysql> show processlist\G

mysqladmin -uroot -p123456 processlist

修改my.cnf文件里的wait_timeout的值咽笼,讓其更小一些顷编,默認wait_timeout =28800,這里改為100

mysql> set global wait_timeout=100;

mysql> show global variables like "wait_timeout";

  1. 51. ****sort_buffer_size****參數(shù)作用剑刑?如何在線修改生效媳纬?

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

mysql> set global sort_buffer_size =131072; #單位為B素挽,即128KB,默認64K

  1. 52. ****如何在線正確清理MySQL binlog****狸驳?

自動清除

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

手動清除

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

  1. 53. ****Binlog****工作模式有哪些预明?各什么特點缩赛,企業(yè)如何選擇?

1.row level行級模式

優(yōu)點:記錄數(shù)據(jù)詳細(每行)撰糠,主從一致

缺點:占用大量的磁盤空間酥馍,降低了磁盤的性能

2.statement level模式(默認)

優(yōu)點:記錄的簡單,內(nèi)容少 窗慎,節(jié)約了IO物喷,提高性能 缺點:導致主從不一致

3.MIXED混合模式

結(jié)合了statement和row模式的優(yōu)點,會根據(jù)執(zhí)行的每一條具體的SQL語句來區(qū)分對待記錄的日志形式遮斥。對于函數(shù)峦失,觸發(fā)器,存儲過程會自動使用row level模式

企業(yè)場景選擇:

1.互聯(lián)網(wǎng)公司使用mysql的功能較少(不用存儲過程术吗、觸發(fā)器尉辑、函數(shù)),選擇默認的statement模式较屿。

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

3.用到mysql的特殊功能(存儲過程隘蝎、觸發(fā)器购啄、函數(shù)),有希望數(shù)據(jù)最大化一致則選擇row模式嘱么。

  1. 54. ****誤操作執(zhí)行了一個drop****庫SQL****語句狮含,如何完整恢復(fù)?

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

  1. 手動切割binlog日志并記好切割好的binlog日志文件位置冰评,這里假設(shè)為009映胁,備份全部binlog日志

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

  3. 用mysqladmin命令將005到008binlog文件中的SQL語句分離出來甲雅,并找到drop庫的語句將其刪掉

  4. 將之前全備數(shù)據(jù)導入mysql服務(wù)器

  5. 將步驟3中分離出的SQL語句導入mysql服務(wù)器

  6. 將009binlog文件刪除解孙,再次刷新binlog日志历造,到此數(shù)據(jù)庫已恢復(fù)成功蚜厉。

  7. 55. ****mysqldump****備份使用了-A -B****參數(shù)汹粤,如何實現(xiàn)恢復(fù)單表惕橙?

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

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

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

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

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

  2. 詳述MySQL****主從復(fù)制原理及配置主從的完整步驟带膜。

主從復(fù)制原理:

image
  1. 主:binlog線程但指,記錄所有改變了數(shù)據(jù)庫數(shù)據(jù)的語句仅叫,放進master上的binlog中
  2. 從:IO線程膏斤,在使用start slave之后,負責從master上拉取binlog內(nèi)容中剩,放進自己的relay log中
  3. 從:SQL執(zhí)行線程忌穿,執(zhí)行relay log中的語句。

配置步驟:

  1. 主庫開啟binlog日志功能

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

  3. 從庫上配置和主庫的連接信息

  4. 將全備數(shù)據(jù)導入從庫

  5. 從庫啟動slave

  6. 在從庫上查看同步狀態(tài)掠剑,確認是否同步成功

  7. 57. ****如何開啟從庫的binlog****功能?

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

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

兩臺數(shù)據(jù)庫都開啟binlog功能朴译,相互為主從配置。

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

  1. 讓表的ID自增属铁,然后主1寫1眠寿、3、5焦蘑,主2寫2盯拱、4、6
  2. 不讓表的ID自增例嘱,然后通過web端程序去seq服務(wù)器取ID狡逢,寫入雙主。

雙主工作場景為高并發(fā)寫的場景拼卵,慎用奢浑。

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

第一臺數(shù)據(jù)庫開啟binlog功能設(shè)為主服務(wù)器腋腮,第二臺數(shù)據(jù)庫也開啟binlog功能殷费,設(shè)為第一臺服務(wù)器的從服務(wù)器,設(shè)為其他數(shù)據(jù)庫的主服務(wù)器

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

解決辦法1:

登陸從庫上操作:

  1. stop slave 臨時停止同步開關(guān)
  2. set global sql_slave_skip_counter=1,將同步指針向下移動一個仍律,也可以多個嘿悬,如果多次不同步,可以重復(fù)操作水泉。
  3. start slave善涨,重啟主從復(fù)制開關(guān)

解決辦法2:

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

slave-skip-errors=1032,1062,1007

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

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

mysql> show slave status\G

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Seconds_Behind_Master: 0

  1. 62. ****MySQL****數(shù)據(jù)庫如何實現(xiàn)讀寫分離草则?
  2. 通過程序?qū)崿F(xiàn)讀寫分離(性能钢拧,效率最佳,推薦

PHP和Java程序都可以通過設(shè)置多個連接文件輕松的實現(xiàn)對數(shù)據(jù)庫的讀寫分離炕横,即當select時源内,就去連接讀庫的連接文件,當update份殿、insert膜钓、delete是就去連接寫庫的連接文件嗽交。

  1. 通過軟件實現(xiàn)讀寫分離

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

  1. 開發(fā)dbproxy

  2. 63. ****生產(chǎn)一主多從從庫宕機夫壁,如何手工恢復(fù)?

處理方法:重做slave

  1. 停止slave

  2. 導入備份數(shù)據(jù)

  3. 配置master.info信息

  4. 啟動slave

  5. 檢查從庫狀態(tài)

  6. 64. ****生產(chǎn)一主多從主庫宕機沃疮,如何手工恢復(fù)盒让?

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

1.登陸從庫檢查IO線程和SQL線程狀態(tài)show processlist\G邑茄,確認SQL線程已讀完所有relay-log

2.登陸所有從庫檢查master.info信息,查看哪個從庫的binlog文件和位置是最新的葱她,選擇最新的從庫切換為主庫(或利用半同步功能撩扒,直接選擇做了實時同步的從庫為主庫)

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

4.登陸要切換為主庫的從庫,進行切換操作豪墅。

stop slave;reset master;quit

5.進入要切換的從庫數(shù)據(jù)目錄泉手,刪除master.info和relay-log.info文件,并檢查授權(quán)表偶器,read_only等參數(shù)

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

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

log-slave-updates

read-only

  1. 對同步用戶進行提權(quán)屏轰,保證權(quán)限與主庫用戶權(quán)限一樣
  2. 重啟數(shù)據(jù)庫提生為主庫
  3. 其他從庫操作

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

(2) 停止從庫颊郎,修改master信息

(3) 啟動從庫同步,檢查同步狀態(tài)

  1. 修改web程序的連接配置霎苗,從原主庫指向新主庫
  2. 維護損壞的主庫姆吭,完成后作為從庫使用,或切換回來
  3. 如果主庫沒有宕機唁盏,只是想按計劃切換一下主庫内狸,就非常簡單

(1) 主庫鎖表

(2) 登陸所有從庫檢查同步狀態(tài),查看是否完成同步厘擂。

(3) 其他按上面步驟進行切換

  1. 65. ****MySQL****出現(xiàn)復(fù)制延遲有哪些原因昆淡?如何解決?
  2. 一個主庫的從庫太多刽严,導致復(fù)制延遲

建議從庫數(shù)量3-5個為宜昂灵,要復(fù)制的從節(jié)點數(shù)量過多,會導致復(fù)制延遲

  1. 從庫硬件比主庫差,導致復(fù)制延遲

查看master和slave的系統(tǒng)配置倔既,可能會因為機器配置問題恕曲,包括磁盤IO、CPU渤涌、內(nèi)存等各方面因素造成復(fù)制的延遲佩谣,一般發(fā)生在高并發(fā)大數(shù)據(jù)量的寫入場景。

  1. 慢SQL語句過多

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

  1. 主從復(fù)制設(shè)計問題

主從復(fù)制單線程调鬓,如果主庫寫并發(fā)太大,來不及傳送到從庫就會導致延遲酌伊。更高版本的mysql可以支持多線程復(fù)制腾窝,門戶網(wǎng)站則會自己開發(fā)多線程同步功能。

  1. 主從庫之間網(wǎng)絡(luò)延遲

主從庫的網(wǎng)卡居砖,網(wǎng)線虹脯,連接的交換機等網(wǎng)絡(luò)設(shè)備都可能成為復(fù)制的瓶頸,導致復(fù)制延遲奏候,另外循集,跨公網(wǎng)主從復(fù)制很容易導致主從復(fù)制延遲。

  1. 主庫讀寫壓力大蔗草,導致復(fù)制延遲

主庫硬件要搞好一點咒彤,架構(gòu)的前端要加buffer。

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

  2. 利用mysqldump做定時備份镶柱,根據(jù)情況可按天或按周做全庫備份。

  3. 用rsync+inotify對主庫binlog做實時備份

  4. 67. ****什么是數(shù)據(jù)庫事務(wù)模叙,事務(wù)有哪些特性奸例?企業(yè)如何選擇?

事務(wù)就是指邏輯上的一組SQL語句操作向楼,組成這組操作的各個SQL語句,執(zhí)行時要么全成功要么全失敗谐区。

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

  1. 原子性(atomicity)

整個事務(wù)的所有操作湖蜕,要么全部完成,要么全部不完成宋列,不可能停滯在中間某個環(huán)節(jié)昭抒。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣灭返。

  1. 一致性(consistency)

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

  1. 隔離性(isolation)

當并發(fā)訪問數(shù)據(jù)庫時,一個正在執(zhí)行的事務(wù)在執(zhí)行完畢前熙含,對于其他的會話是不可見的罚缕,多個并發(fā)事務(wù)之間的數(shù)據(jù)是相互隔離的。

  1. 持久性(durability)

一個事務(wù)一旦被提交怎静,它對數(shù)據(jù)庫中的數(shù)據(jù)改變就是永久性的邮弹,如果出了錯誤,事務(wù)也不允許撤銷蚓聘。

  1. 68. ****請解釋全備腌乡、增備、冷備夜牡、熱備概念及企業(yè)實踐經(jīng)驗与纽?

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

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

冷備:需要關(guān)閉mysql服務(wù)急迂,讀寫請求均不允許狀態(tài)下進行。

溫備:服務(wù)在線氢哮,但僅支持讀請求袋毙,不允許寫請求的情況下備份。

熱備:備份的同時冗尤,業(yè)務(wù)不受影響听盖。

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

  2. 在表中建立索引裂七,優(yōu)先考慮where皆看、group by使用到的字段

  3. 盡量避免使用select *,返回無用的字段會降低查詢效率

  4. 盡量避免使用in和not in背零,會導致數(shù)據(jù)庫引擎放棄索引進行全表掃描

  5. 盡量避免使用or腰吟,會導致數(shù)據(jù)庫引擎放棄索引進行全表掃描

  6. 盡量避免在字段開頭模糊查詢,會導致數(shù)據(jù)庫引擎放棄索引進行全表掃描

  7. 70. ****MySQL****中MyISAM****與InnoDB****的區(qū)別徙瓶,至少5****點

(1) 問5點不同

  1. InnoDB支持事務(wù)毛雇,而MyISAM不支持事務(wù)。
  2. InnoDB支持行級鎖侦镇,而MyISAM支持表級鎖
  3. InnoDB支持MVCC灵疮,而MyISAM不支持
  4. InnoDB支持外鍵,而MyISAM不支持
  5. InnoDB不支持全文索引壳繁,而MyISAM支持

(2) InnoDB引擎的3大特性

插入緩存(insert buffer)震捣、二次寫(double write)荔棉、自適應(yīng)哈希索引(ahi)、預(yù)讀(read ahead)(3)二者select count(*)哪個更快蒿赢,為什么润樱?

MyISAM更快,因為MyISAM內(nèi)部維護了一個計數(shù)器羡棵,可以直接調(diào)取壹若。

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

  1. 71. ****如何調(diào)整生產(chǎn)線中MySQL****數(shù)據(jù)庫的字符集舌稀。
  2. 修改my.cnf文件中的字符集配置
  3. 查看當前字符集設(shè)置

mysql> show global variables like "character%";

  1. 用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;

  1. 72. ****請描述MySQL****里中文數(shù)據(jù)亂碼原理,如何防止亂碼灼擂?

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

  1. 73. ****企業(yè)生產(chǎn)MySQL****如何優(yōu)化(請多角度描述)剔应?
  2. 硬件優(yōu)化

CPU睡腿、內(nèi)存、磁盤峻贮、網(wǎng)卡

  1. 軟件優(yōu)化

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

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

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

  2. 74. ****MySQL****高可用方案有哪些纤控,各自特點****挂捻,企業(yè)如何選擇?

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

優(yōu)點:成本低船万、架構(gòu)簡單刻撒、易實施、維護方便

缺點:master出現(xiàn)問題后不能自動到slave上耿导,需要人工干涉声怔。

  1. MySQL Cluster

優(yōu)點:安全性高,穩(wěn)定性高舱呻〈谆穑可以在線增加節(jié)點

缺點:架構(gòu)復(fù)雜,至少三個節(jié)點箱吕,對于引擎只能用ndb芥驳,不支持外鍵,管理復(fù)雜茬高,部署費時而且是收費的兆旬。

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

優(yōu)點:安全性、穩(wěn)定性高雅采,出現(xiàn)故障系統(tǒng)將自動切換爵憎,從而保證服務(wù)的連續(xù)性。

缺點:可能會發(fā)生腦裂

  1. HeartBeat+DRBD+MySQL

優(yōu)點:安全性婚瓜、穩(wěn)定性宝鼓、出現(xiàn)故障系統(tǒng)將自動切換,從而保證服務(wù)的連續(xù)性巴刻。

缺點:只用一臺服務(wù)器提供服務(wù)愚铡,成本高,可能發(fā)生腦裂

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

備份庫:

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

備份表

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

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

!/bin/sh

cmd="mysql -uroot -pabc123 -e"

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

tables=/file.txt

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

do

cmd "use 庫名;alter tablen engine=myisam"

done

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

!/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 databasen default character set utf8;"

done

  1. 77. ****網(wǎng)站打開慢,請給出排查方法柠座,如是數(shù)據(jù)庫慢導致邑雅,如何排查并解決,請分析并舉例妈经?

  2. 檢查操作系統(tǒng)是否負載過高

  3. 登陸mysql查看有哪些sql語句占用時間過長淮野,show processlist;

  4. 用explain查看消耗時間過長的SQL語句是否走了索引

  5. 對SQL語句優(yōu)化,建立索引

  6. 78. ****xtranbackup****的備份吹泡、增量備份及恢復(fù)的工作原理****骤星?

XtraBackup基于InnoDB的crash-recovery功能,它會復(fù)制InnoDB的data file爆哑,由于不鎖表洞难,復(fù)制出來的數(shù)據(jù)是不一致的,在恢復(fù)的時候使用crash-recovery揭朝,使得數(shù)據(jù)恢復(fù)一致队贱。

InnoDB維護了一個redo log,又稱為transaction log(事務(wù)日志)萝勤,它包含了InnoDB數(shù)據(jù)的所有改動情況露筒。當InnoDB啟動的時候,它會先去檢查data file和transaction log敌卓,并且會做兩步操作:

XtraBackup在備份的時候慎式,一頁一頁的復(fù)制InnoDB的數(shù)據(jù),而且不鎖定表趟径,與此同時瘪吏,XtraBackup還有另外一個線程監(jiān)視著transaction log,一旦log發(fā)生變化蜗巧,就把變化過的log pages復(fù)制走掌眠。為什么要著急復(fù)制走呢?因為transaction log文件大小有限幕屹,寫滿之后蓝丙,就會從頭再開始寫级遭,所以新數(shù)據(jù)可能會覆蓋到舊的數(shù)據(jù)。

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

  1. 79. ****誤執(zhí)行drop****數(shù)據(jù)挫鸽,如何通過xtrabackup****恢復(fù)?

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

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

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

  5. 啟動mysql服務(wù)

  6. 如何做主從數(shù)據(jù)一致性校驗鸥跟?

主從一致性校驗有多種工具 例如checksum丢郊、mysqldiff、pt-table-checksum等

  1. 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)

  1. MySQL****索引的種類及工作原理枫匾。

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

唯一索引:與普通索引類似干茉,不同的是,索引列的值必須唯一惩歉,但允許有空值等脂。

主鍵索引:它是一種特殊的唯一索引,不允許有空值撑蚌。一張表只能有一個主鍵上遥。

組合索引:就是將多個字段建到一個索引里。

  1. 83. ****如何自定義腳本啟動MySQL(****說出關(guān)鍵命令)

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

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

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

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

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

insert粉楚、update、delete亮垫、alter等走主庫模软,select等走從庫

  1. mysqldump****導入導出默認把所有數(shù)據(jù)都縮減在一行里面,為了查看和修改方便饮潦,如何將數(shù)據(jù)以多行插入的形式導出燃异。

用--skip-extend-insert選項

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

開源監(jiān)控工具有很多继蜡,如zabbix回俐,nagios

Lepus(天兔):簡潔、直觀稀并、強大的開源數(shù)據(jù)庫監(jiān)控系統(tǒng)仅颇,MySQL/Oracle/MongoDB/Redis一站式性能監(jiān)控,讓數(shù)據(jù)庫監(jiān)控更簡單

  1. 公司現(xiàn)有的數(shù)據(jù)庫架構(gòu)碘举,總共有幾組****mysql****庫忘瓦?

我們公司現(xiàn)在有兩組MySQL。其中一套是生產(chǎn)庫引颈,一套是測試庫耕皮。

生產(chǎn)庫和測試庫都是用的mha +半同步復(fù)制做的高可用境蜕。
我們所有的項目web前端量(大概有10個項目)指向的都是一個機器上的mysql實例。因為我們是傳統(tǒng)行業(yè)凌停,并發(fā)訪問量并不是很大汽摹,所以目前我們的生產(chǎn)mysql數(shù)據(jù)庫未出現(xiàn)性能問題。

  1. mysql****的權(quán)限怎么管理苦锨?
    只給insert,update,select和delete四個權(quán)限即可趴泌。有時候delete都不給舟舒。

  2. 如果發(fā)現(xiàn)****CPU****,或者****IO****壓力很大嗜憔,怎么定位問題秃励?
    1、首先我會用top命令和iostat命令吉捶,定位是什么進程在占用cpu和磁盤io夺鲜;
    2、如果是mysql的問題呐舔,我會登錄到數(shù)據(jù)庫币励,通過show full processlist命令,看現(xiàn)在數(shù)據(jù)庫在執(zhí)行什么sql語句珊拼,是否有語句長時間執(zhí)行使數(shù)據(jù)庫卡资成搿;
    3澎现、執(zhí)行show engine innodb status\G命令仅胞,查看數(shù)據(jù)庫是否有鎖資源爭用;
    4剑辫、查看mysql慢查詢?nèi)罩靖删桑词欠裼新齭ql;
    5妹蔽、找到引起數(shù)據(jù)庫占用資源高的語句椎眯,進行優(yōu)化,該建索引的建索引讹开,索引不合適的刪索引盅视,或者根據(jù)情況kill掉耗費資源的sql語句等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旦万,隨后出現(xiàn)的幾起案子闹击,更是在濱河造成了極大的恐慌,老刑警劉巖成艘,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赏半,死亡現(xiàn)場離奇詭異贺归,居然都是意外死亡,警方通過查閱死者的電腦和手機断箫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門拂酣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仲义,你說我怎么就攤上這事婶熬。” “怎么了埃撵?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵赵颅,是天一觀的道長。 經(jīng)常有香客問我暂刘,道長饺谬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任谣拣,我火速辦了婚禮募寨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘森缠。我一直安慰自己拔鹰,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布贵涵。 她就那樣靜靜地躺著格郁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪独悴。 梳的紋絲不亂的頭發(fā)上例书,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音刻炒,去河邊找鬼决采。 笑死,一個胖子當著我的面吹牛坟奥,可吹牛的內(nèi)容都是我干的树瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼爱谁,長吁一口氣:“原來是場噩夢啊……” “哼晒喷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起访敌,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤凉敲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爷抓,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡势决,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓝撇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片果复。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渤昌,靈堂內(nèi)的尸體忽然破棺而出虽抄,到底是詐尸還是另有隱情,我是刑警寧澤独柑,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布极颓,位于F島的核電站,受9級特大地震影響群嗤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜兵琳,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一狂秘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躯肌,春花似錦者春、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嫡丙,卻和暖如春拴袭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曙博。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工拥刻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人父泳。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓般哼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惠窄。 傳聞我的和親對象是個殘疾皇子蒸眠,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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

  • 1.什么是索引? 索引是對數(shù)據(jù)庫中一或多個列值的排序杆融,幫助數(shù)據(jù)庫高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)楞卡。假如我們用類比的方法,數(shù)據(jù)...
    wangfeiyu閱讀 4,094評論 0 2
  • 索引是什么索引是對數(shù)據(jù)庫中一或多個列值的排序,幫助數(shù)據(jù)庫高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)假如我們用類比的方法臀晃,數(shù)據(jù)庫中的索引...
    帶著小豬闖天下閱讀 2,092評論 0 18
  • 一觉渴、MySQL優(yōu)化 MySQL優(yōu)化從哪些方面入手: (1)存儲層(數(shù)據(jù)) 構(gòu)建良好的數(shù)據(jù)結(jié)構(gòu)』胀铮可以大大的提升我們S...
    寵辱不驚丶歲月靜好閱讀 2,415評論 1 8
  • 開啟:./mysqld_safe --default-file=/etc/my.cnf --user=mysql ...
    SkTj閱讀 413評論 0 1
  • 雖然不能恢復(fù)百分百案淋,至少能將損失降到最低。 有個問題測試: 主從同步時险绘,主庫網(wǎng)絡(luò)斷開踢京,binlog dump線程...
    kun_zhang閱讀 3,026評論 0 6