Linux運(yùn)維工程師面試題(6)

Linux運(yùn)維工程師面試題(6)
1 數(shù)據(jù)庫事務(wù)的四個(gè)特性及含義
2 mysql 的 sql 語句怎么優(yōu)化
3 varchar 與 char 的區(qū)別是什么?大小限制?utf8 字符集下 varchar 最多能存多少個(gè)字符?
4 索引有什么用?
5 sql 注入是怎么產(chǎn)生的,如何防止?
6 csrf 是什么?如何防范?
7 如何加強(qiáng) MySQL 安全,請給出可行的具體措施?
8 如是數(shù)據(jù)庫慢導(dǎo)致網(wǎng)站打開慢,如何排查并解決?
9 MySQL 有多少種日志
10 MySQL 數(shù)據(jù)庫 cpu 飆升到500%的話他怎么處理?
Linux運(yùn)維工程師面試題(6)
祝各位小伙伴們早日找到自己心儀的工作。
持續(xù)學(xué)習(xí)才不會被淘汰。
機(jī)會總是留給有有準(zhǔn)備的人的。
加油,打工人!
1 數(shù)據(jù)庫事務(wù)的四個(gè)特性及含義
數(shù)據(jù)庫事務(wù)的4個(gè)特性:原?性、持久性、?致性、隔離性
原?性:整個(gè)事務(wù)中的所有操作要么全部完成, 要么全部都不完成, 如果在事務(wù)中操作出現(xiàn)異常,那么事務(wù)將會進(jìn)?回滾,就像這個(gè)事務(wù)從來沒有執(zhí)?過?樣;
持久性:在事務(wù)完成后,該事務(wù)所有的操作都將持久化在數(shù)據(jù)庫中,不會被回滾;
?致性:在事務(wù)開始之前和事務(wù)結(jié)束之后,數(shù)據(jù)庫的完整性約束并沒有被破壞;
隔離性:確保在同?時(shí)間類只有?個(gè)事務(wù)處理某個(gè)數(shù)據(jù)。
2 mysql 的 sql 語句怎么優(yōu)化
盡量避免使用or、in、not in 和在 where 語句后?使? !=、<>操作符以及對NULL值得判斷, 否則數(shù)據(jù)庫引擎將放棄索引而使用全表掃描。使用 exists 替換 in。
盡量放棄使? select *,返回?zé)o用的字段會降低查詢效率,需要什么數(shù)據(jù)就取出什么數(shù)據(jù)。
使? join 代替?查詢。
設(shè)置合適的字段屬性:例如盡量把字段設(shè)置為 NOT NULL,這樣引擎就不要對?NULL值。
在表中建立索引,優(yōu)先考慮where、group by使用到的字段。
盡量避免在字段開頭模糊查詢,會導(dǎo)致數(shù)據(jù)庫引擎放棄索引進(jìn)行全表掃描
3 varchar 與 char 的區(qū)別是什么?大小限制?utf8 字符集下 varchar 最多能存多少個(gè)字符?
char 和 varchar 最?的不同就是?個(gè)是固定?度,?個(gè)是可變?度。由于是可變?度,因此存儲的是實(shí)際字符串再加上?個(gè)記錄字符串?度的字節(jié)。如果分配給 char 或 varchar 列的值超過列的最??度,則對值進(jìn)?裁剪。
varchar(M) 和 char(M),M都表示字符數(shù)。varchar的最大長度為65535個(gè)字節(jié),不同的編碼所對應(yīng)的最?可存儲的字符數(shù)不同。char 最多可以存放255個(gè)字符,不同的編碼最?可?字節(jié)數(shù)不同。字符類型若為utf8,每個(gè)字符最多占3個(gè)字節(jié),varchar 最大長度不能超過21845。
例:
char(4)定義的是固定長度4,存儲時(shí),如果字符數(shù)不夠4位,會在后面用空格補(bǔ)全存入數(shù)據(jù)庫。
varchar(4)定義的是變長長度,存儲時(shí),如果字符沒有達(dá)到定義的位數(shù)4時(shí),也不會在后面補(bǔ)空格。
4 索引有什么用?
對于建?索引的列, mysql 的查詢效率會提?很多。
索引可以降低服務(wù)需要掃描的數(shù)據(jù)量,減少了I/O次數(shù)
索引可以幫助服務(wù)器避免排序和使用臨時(shí)表
索引可以幫助將隨機(jī)I/O轉(zhuǎn)為順序I/O
5 sql 注入是怎么產(chǎn)生的,如何防止?
sql 注?產(chǎn)?原因:因?yàn)樵诔绦蜷_發(fā)過程中沒有對 sql 語句進(jìn)行檢查或未進(jìn)行關(guān)鍵字檢查,導(dǎo)致客戶端可以提交 sql 語句到服務(wù)器運(yùn)行。
如何防止:
對 sql 與進(jìn)行檢查,過濾。
不要使用 sql 拼接的方式來拼接 sql 語句,對常?的方法進(jìn)行封裝避免暴露 sql 語句(使用ORM)。
6 csrf 是什么?如何防范?
csrf 成為跨站偽造請求,利用用戶信任過的?站去執(zhí)??些惡意的操作
如何防范:
檢查 Referer 字段,嚴(yán)格要求該字段只來自于信任的URL;
添加校驗(yàn) token,將 token 值附加在表單中,攻擊者是無法獲取這個(gè)字,服務(wù)端進(jìn)行檢查發(fā)現(xiàn)該值為空時(shí)將會拒絕服務(wù)。
7 如何加強(qiáng) MySQL 安全,請給出可行的具體措施?
避免直接從互聯(lián)網(wǎng)訪問 mysql 數(shù)據(jù)庫,確保特定主機(jī)才擁有訪問權(quán)限;
定期備份數(shù)據(jù)庫;
禁用或限制遠(yuǎn)程訪問,在 my.cnf 文件里設(shè)置 bind-address 指定 ip;
移除 test 數(shù)據(jù)庫(默認(rèn)匿名用戶可以訪問 test 數(shù)據(jù)庫);
禁用 local infile
mysql> select load_file("/etc/passwd");
在 my.cnf 里 [mysqld] 下添加set-variable=local-infile=0
移除匿名賬戶和廢棄的賬戶;
限制 mysql 數(shù)據(jù)庫用戶的權(quán)限;
移除和禁用
.mysql_history
文件。
8 如是數(shù)據(jù)庫慢導(dǎo)致網(wǎng)站打開慢,如何排查并解決?
登陸 mysql 查看有哪些 sql 語句占用時(shí)間過長,
how processlist;
用 explain 查看消耗時(shí)間過長的 SQL 語句是否走了索引;
對 SQL 語句優(yōu)化,建立索引。
9 MySQL 有多少種日志
錯誤日志:error log,記錄出錯信息,也記錄一些警告信息或者正確的信息;
通用日志:general log,記錄所有對數(shù)據(jù)庫請求的信息,不論這些請求是否得到了正確的執(zhí)行;
慢查詢?nèi)罩荆簊low query log,設(shè)置一個(gè)閾值,將運(yùn)行時(shí)間超過該值的所有 SQL 語句都記錄到慢查詢的日志文件中;
二進(jìn)制日志:binary log,記錄對數(shù)據(jù)庫執(zhí)行更改的所有操作;
中繼日志:reley log,在主從復(fù)制架構(gòu)中,從服務(wù)器用于保存從主服務(wù)器的二進(jìn)制日志中讀取的事件;
事務(wù)日志:transaction log,事務(wù)日志的寫入類型為"追加",因此其操作為"順序IO";通常也被稱為:預(yù)寫式日志write ahead logging。事務(wù)日志文件:ib_logfile0,ib_logfile1。
10 MySQL 數(shù)據(jù)庫 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ù)會激增,再做出相應(yīng)的調(diào)整,比如說限制連接數(shù)等。
以上面試題僅僅個(gè)人總結(jié),想到什么就寫什么,沒有任何順序,寫的有什么不對的地方請各位大佬評論、留言,我會及時(shí)更正。
原文鏈接: [Linux運(yùn)維工程師面試題(6)](https://blog.waluna.top/2023/03/11/1357/).