一.基礎(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ǔ)知識面試問答題
- 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。
缺點:
高并發(fā)讀寫需求:網(wǎng)站的用戶并發(fā)非常高面睛,往往達到每秒上萬次讀寫請求絮蒿,對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫來說,硬盤I/O是一個很大的瓶頸叁鉴。
海量數(shù)據(jù)的高效讀寫:對于數(shù)據(jù)量巨大的網(wǎng)站來說,關(guān)系型數(shù)據(jù)庫的查詢效率非常低佛寿。
固定的表結(jié)構(gòu)幌墓。
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è)占用最大的份額廉油。
42. ****請解釋非關(guān)系型數(shù)據(jù)庫概念及主要特點?
使用鍵值對存儲數(shù)據(jù)苗傅,且結(jié)構(gòu)不固定
一般不支持ACID特性抒线。
基于鍵值對,數(shù)據(jù)沒有耦合性金吗,容易擴展十兢。
不提供SQL支持趣竣,學習和使用成本較高。
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)用場景仲吏。
- 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ù)庫里的表,記錄
- 45. ****請詳細描述char(4)****和varchar(4)****的差別奕剃。
char(4)定義的是固定長度4衷旅,存儲時捐腿,如果字符數(shù)不夠4位,會在后面用空格補全存入數(shù)據(jù)庫柿顶。
varchar(4)定義的是變長長度茄袖,存儲時,如果字符沒有達到定義的位數(shù)4時嘁锯,也不會在后面補空格宪祥。
- 46. ****如何授權(quán)oldboy****用戶從172.16.1.0/24****訪問數(shù)據(jù)庫。
mysql> grant all on . to oldboy@'172.16.1.%' identified by '123456';
- 47. ****什么是MySQL****多實例家乘,如何配置MySQL****多實例蝗羊?
在一臺服務(wù)器上,mysql服務(wù)開啟多個不同的端口仁锯,運行多個服務(wù)進程耀找,這些mysql服務(wù)進程通過不同的socket來監(jiān)聽不同的數(shù)據(jù)端口,進而互不干涉的提供各自的服務(wù)业崖。
- 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
- 49. ****delete****和truncate****刪除數(shù)據(jù)的區(qū)別****涝登?
truncate table test執(zhí)行更快雄家,清空物理文件,清空表中的所有內(nèi)容
delete from test是邏輯刪除胀滚,按行刪除趟济,而且可以通過where語句選擇要刪除的行
- 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";
- 51. ****sort_buffer_size****參數(shù)作用剑刑?如何在線修改生效媳纬?
mysql執(zhí)行排序使用的緩沖大小。如果想要增加order by的速度施掏,首先看是否可以讓mysql使用索引而不是額外的排序階段钮惠,如果不能,可以嘗試增加sort_buffer_size變量的大小七芭。
mysql> set global sort_buffer_size =131072; #單位為B素挽,即128KB,默認64K
- 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日志
- 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模式嘱么。
- 54. ****誤操作執(zhí)行了一個drop****庫SQL****語句狮含,如何完整恢復(fù)?
如果條件允許曼振,操作前最好禁止外面一切服務(wù)器訪問mysql數(shù)據(jù)庫几迄,這里假設(shè)禁止外面訪問數(shù)據(jù)庫,具體步驟如下:
手動切割binlog日志并記好切割好的binlog日志文件位置冰评,這里假設(shè)為009映胁,備份全部binlog日志
找到之前全備數(shù)據(jù)最后備份到的binlog文件位置并記好位置,這幾假設(shè)為005
用mysqladmin命令將005到008binlog文件中的SQL語句分離出來甲雅,并找到drop庫的語句將其刪掉
將之前全備數(shù)據(jù)導入mysql服務(wù)器
將步驟3中分離出的SQL語句導入mysql服務(wù)器
將009binlog文件刪除解孙,再次刷新binlog日志历造,到此數(shù)據(jù)庫已恢復(fù)成功蚜厉。
55. ****mysqldump****備份使用了-A -B****參數(shù)汹粤,如何實現(xiàn)恢復(fù)單表惕橙?
先用sed或awk將全庫中的需要的表結(jié)構(gòu)過濾出來
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE SC
/!d;q' /opt/bak_2017-12-07.sql
- 再用grep將全庫中相應(yīng)的表內(nèi)容過濾出來
grep 'INSERT INTO SC
' /opt/bak_2017-12-07.sql
將1和2中過濾出來的SQL語句導入數(shù)據(jù)庫即可
詳述MySQL****主從復(fù)制原理及配置主從的完整步驟带膜。
主從復(fù)制原理:
- 主:binlog線程但指,記錄所有改變了數(shù)據(jù)庫數(shù)據(jù)的語句仅叫,放進master上的binlog中
- 從:IO線程膏斤,在使用start slave之后,負責從master上拉取binlog內(nèi)容中剩,放進自己的relay log中
- 從:SQL執(zhí)行線程忌穿,執(zhí)行relay log中的語句。
配置步驟:
主庫開啟binlog日志功能
全備數(shù)據(jù)庫结啼,記錄好binlog文件和相應(yīng)的位置
從庫上配置和主庫的連接信息
將全備數(shù)據(jù)導入從庫
從庫啟動slave
在從庫上查看同步狀態(tài)掠剑,確認是否同步成功
57. ****如何開啟從庫的binlog****功能?
在my.cnf文件中寫入log-bin=mysql-bin
- 58. ****MySQL****如何實現(xiàn)雙向互為主從復(fù)制郊愧,并說明應(yīng)用場景****?
兩臺數(shù)據(jù)庫都開啟binlog功能朴译,相互為主從配置。
雙主的實現(xiàn)方式主要有兩種:
- 讓表的ID自增属铁,然后主1寫1眠寿、3、5焦蘑,主2寫2盯拱、4、6
- 不讓表的ID自增例嘱,然后通過web端程序去seq服務(wù)器取ID狡逢,寫入雙主。
雙主工作場景為高并發(fā)寫的場景拼卵,慎用奢浑。
- 59. ****MySQL****如何實現(xiàn)級聯(lián)同步,并說明應(yīng)用場景?
第一臺數(shù)據(jù)庫開啟binlog功能設(shè)為主服務(wù)器腋腮,第二臺數(shù)據(jù)庫也開啟binlog功能殷费,設(shè)為第一臺服務(wù)器的從服務(wù)器,設(shè)為其他數(shù)據(jù)庫的主服務(wù)器
- 60. ****MySQL****主從復(fù)制故障如何解決低葫?
解決辦法1:
登陸從庫上操作:
- stop slave 臨時停止同步開關(guān)
- set global sql_slave_skip_counter=1,將同步指針向下移動一個仍律,也可以多個嘿悬,如果多次不同步,可以重復(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進程狀態(tài)是否OK,同步延遲時間是否小于1分鐘
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
- 62. ****MySQL****數(shù)據(jù)庫如何實現(xiàn)讀寫分離草则?
- 通過程序?qū)崿F(xiàn)讀寫分離(性能钢拧,效率最佳,推薦
PHP和Java程序都可以通過設(shè)置多個連接文件輕松的實現(xiàn)對數(shù)據(jù)庫的讀寫分離炕横,即當select時源内,就去連接讀庫的連接文件,當update份殿、insert膜钓、delete是就去連接寫庫的連接文件嗽交。
- 通過軟件實現(xiàn)讀寫分離
MySQL-proxy,Amoeba等代理軟件也可以實現(xiàn)讀寫分離功能,但最常用最好用的還是程序?qū)崿F(xiàn)讀寫分離颂斜。
開發(fā)dbproxy
63. ****生產(chǎn)一主多從從庫宕機夫壁,如何手工恢復(fù)?
處理方法:重做slave
停止slave
導入備份數(shù)據(jù)
配置master.info信息
啟動slave
檢查從庫狀態(tài)
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
- 對同步用戶進行提權(quán)屏轰,保證權(quán)限與主庫用戶權(quán)限一樣
- 重啟數(shù)據(jù)庫提生為主庫
- 其他從庫操作
(1) 檢查運行環(huán)境和用戶
(2) 停止從庫颊郎,修改master信息
(3) 啟動從庫同步,檢查同步狀態(tài)
- 修改web程序的連接配置霎苗,從原主庫指向新主庫
- 維護損壞的主庫姆吭,完成后作為從庫使用,或切換回來
- 如果主庫沒有宕機唁盏,只是想按計劃切換一下主庫内狸,就非常簡單
(1) 主庫鎖表
(2) 登陸所有從庫檢查同步狀態(tài),查看是否完成同步厘擂。
(3) 其他按上面步驟進行切換
- 65. ****MySQL****出現(xiàn)復(fù)制延遲有哪些原因昆淡?如何解決?
- 一個主庫的從庫太多刽严,導致復(fù)制延遲
建議從庫數(shù)量3-5個為宜昂灵,要復(fù)制的從節(jié)點數(shù)量過多,會導致復(fù)制延遲
- 從庫硬件比主庫差,導致復(fù)制延遲
查看master和slave的系統(tǒng)配置倔既,可能會因為機器配置問題恕曲,包括磁盤IO、CPU渤涌、內(nèi)存等各方面因素造成復(fù)制的延遲佩谣,一般發(fā)生在高并發(fā)大數(shù)據(jù)量的寫入場景。
- 慢SQL語句過多
假如一條SQL語句執(zhí)行時間是20秒实蓬,那么執(zhí)行完畢到從庫上能查到數(shù)據(jù)也至少是20秒茸俭,可以修改后分多次寫入,通過查看慢查詢?nèi)罩净騭how full processlist命令找出執(zhí)行時間長的查詢語句或者大的事務(wù)安皱。
- 主從復(fù)制設(shè)計問題
主從復(fù)制單線程调鬓,如果主庫寫并發(fā)太大,來不及傳送到從庫就會導致延遲酌伊。更高版本的mysql可以支持多線程復(fù)制腾窝,門戶網(wǎng)站則會自己開發(fā)多線程同步功能。
- 主從庫之間網(wǎng)絡(luò)延遲
主從庫的網(wǎng)卡居砖,網(wǎng)線虹脯,連接的交換機等網(wǎng)絡(luò)設(shè)備都可能成為復(fù)制的瓶頸,導致復(fù)制延遲奏候,另外循集,跨公網(wǎng)主從復(fù)制很容易導致主從復(fù)制延遲。
- 主庫讀寫壓力大蔗草,導致復(fù)制延遲
主庫硬件要搞好一點咒彤,架構(gòu)的前端要加buffer。
66. ****給出企業(yè)生產(chǎn)大型MySQL****集群架構(gòu)可行備份方案咒精?
利用mysqldump做定時備份镶柱,根據(jù)情況可按天或按周做全庫備份。
用rsync+inotify對主庫binlog做實時備份
67. ****什么是數(shù)據(jù)庫事務(wù)模叙,事務(wù)有哪些特性奸例?企業(yè)如何選擇?
事務(wù)就是指邏輯上的一組SQL語句操作向楼,組成這組操作的各個SQL語句,執(zhí)行時要么全成功要么全失敗谐区。
事務(wù)的四大特性(ACID):
- 原子性(atomicity)
整個事務(wù)的所有操作湖蜕,要么全部完成,要么全部不完成宋列,不可能停滯在中間某個環(huán)節(jié)昭抒。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣灭返。
- 一致性(consistency)
事務(wù)發(fā)生前和發(fā)生后盗迟,數(shù)據(jù)的完整性必須保持一致
- 隔離性(isolation)
當并發(fā)訪問數(shù)據(jù)庫時,一個正在執(zhí)行的事務(wù)在執(zhí)行完畢前熙含,對于其他的會話是不可見的罚缕,多個并發(fā)事務(wù)之間的數(shù)據(jù)是相互隔離的。
- 持久性(durability)
一個事務(wù)一旦被提交怎静,它對數(shù)據(jù)庫中的數(shù)據(jù)改變就是永久性的邮弹,如果出了錯誤,事務(wù)也不允許撤銷蚓聘。
- 68. ****請解釋全備腌乡、增備、冷備夜牡、熱備概念及企業(yè)實踐經(jīng)驗与纽?
全備:備份數(shù)據(jù)庫所有數(shù)據(jù)
增備:一次性備份所有數(shù)據(jù),然后再增量備份塘装。
冷備:需要關(guān)閉mysql服務(wù)急迂,讀寫請求均不允許狀態(tài)下進行。
溫備:服務(wù)在線氢哮,但僅支持讀請求袋毙,不允許寫請求的情況下備份。
熱備:備份的同時冗尤,業(yè)務(wù)不受影響听盖。
69. ****MySQL****的SQL****語句如何優(yōu)化?
在表中建立索引裂七,優(yōu)先考慮where皆看、group by使用到的字段
盡量避免使用select *,返回無用的字段會降低查詢效率
盡量避免使用in和not in背零,會導致數(shù)據(jù)庫引擎放棄索引進行全表掃描
盡量避免使用or腰吟,會導致數(shù)據(jù)庫引擎放棄索引進行全表掃描
盡量避免在字段開頭模糊查詢,會導致數(shù)據(jù)庫引擎放棄索引進行全表掃描
70. ****MySQL****中MyISAM****與InnoDB****的區(qū)別徙瓶,至少5****點
(1) 問5點不同
- InnoDB支持事務(wù)毛雇,而MyISAM不支持事務(wù)。
- InnoDB支持行級鎖侦镇,而MyISAM支持表級鎖
- InnoDB支持MVCC灵疮,而MyISAM不支持
- InnoDB支持外鍵,而MyISAM不支持
- 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í)行需注意什么晾腔?
- 71. ****如何調(diào)整生產(chǎn)線中MySQL****數(shù)據(jù)庫的字符集舌稀。
- 修改my.cnf文件中的字符集配置
- 查看當前字符集設(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. ****請描述MySQL****里中文數(shù)據(jù)亂碼原理,如何防止亂碼灼擂?
mysql客戶端 mysql服務(wù)端 操作系統(tǒng)等字符集不一致導致的亂碼壁查,將上述字符集調(diào)成一致。
- 73. ****企業(yè)生產(chǎn)MySQL****如何優(yōu)化(請多角度描述)剔应?
- 硬件優(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****高可用方案有哪些纤控,各自特點****挂捻,企業(yè)如何選擇?
主從復(fù)制+讀寫分離
優(yōu)點:成本低船万、架構(gòu)簡單刻撒、易實施、維護方便
缺點:master出現(xiàn)問題后不能自動到slave上耿导,需要人工干涉声怔。
- MySQL Cluster
優(yōu)點:安全性高,穩(wěn)定性高舱呻〈谆穑可以在線增加節(jié)點
缺點:架構(gòu)復(fù)雜,至少三個節(jié)點箱吕,對于引擎只能用ndb芥驳,不支持外鍵,管理復(fù)雜茬高,部署費時而且是收費的兆旬。
- Heartbeat /keepalived+雙主從復(fù)制
優(yōu)點:安全性、穩(wěn)定性高雅采,出現(xiàn)故障系統(tǒng)將自動切換爵憎,從而保證服務(wù)的連續(xù)性。
缺點:可能會發(fā)生腦裂
- HeartBeat+DRBD+MySQL
優(yōu)點:安全性婚瓜、穩(wěn)定性宝鼓、出現(xiàn)故障系統(tǒng)將自動切換,從而保證服務(wù)的連續(xù)性巴刻。
缺點:只用一臺服務(wù)器提供服務(wù)愚铡,成本高,可能發(fā)生腦裂
- 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
n engine=myisam"
done
- 如何批量更改數(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
n default character set utf8;"
done
77. ****網(wǎng)站打開慢,請給出排查方法柠座,如是數(shù)據(jù)庫慢導致邑雅,如何排查并解決,請分析并舉例妈经?
檢查操作系統(tǒng)是否負載過高
登陸mysql查看有哪些sql語句占用時間過長淮野,show processlist;
用explain查看消耗時間過長的SQL語句是否走了索引
對SQL語句優(yōu)化,建立索引
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
79. ****誤執(zhí)行drop****數(shù)據(jù)挫鸽,如何通過xtrabackup****恢復(fù)?
關(guān)閉mysql服務(wù)
移除mysql的data目錄及數(shù)據(jù)
將備份的數(shù)據(jù)恢復(fù)到mysql的data目錄
啟動mysql服務(wù)
如何做主從數(shù)據(jù)一致性校驗鸥跟?
主從一致性校驗有多種工具 例如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****索引的種類及工作原理枫匾。
普通索引:最基本的索引,沒有任何限制拟淮。
唯一索引:與普通索引類似干茉,不同的是,索引列的值必須唯一惩歉,但允許有空值等脂。
主鍵索引:它是一種特殊的唯一索引,不允許有空值撑蚌。一張表只能有一個主鍵上遥。
組合索引:就是將多個字段建到一個索引里。
- 83. ****如何自定義腳本啟動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. ****你們的公司如何實現(xiàn)數(shù)據(jù)庫讀寫分離的争涌?
通過程序?qū)崿F(xiàn)的讀寫分離
insert粉楚、update、delete亮垫、alter等走主庫模软,select等走從庫
- mysqldump****導入導出默認把所有數(shù)據(jù)都縮減在一行里面,為了查看和修改方便饮潦,如何將數(shù)據(jù)以多行插入的形式導出燃异。
用--skip-extend-insert選項
- 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)控更簡單
- 公司現(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)性能問題。
mysql****的權(quán)限怎么管理苦锨?
只給insert,update,select和delete四個權(quán)限即可趴泌。有時候delete都不給舟舒。如果發(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語句等