mysql筆試+面試題100題分享
轉載自:http://blog.51cto.com/wn2100/2049534
一.基礎筆試命令考察
- 1. 開啟MySQL服務
service mysqld start
/init.d/mysqld start
safe_mysql &
關閉mysql服務
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設置密碼或者修改密碼。
方法一
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數據庫。
單實例登陸
mysql -uroot -p123456
多實例登陸
mysql -uroot -p123456 -S /data/3306/mysql.sock
- 5. 查看當前數據庫的字符集
mysql> show variables like "%charac%";
- 6. 查看當前數據庫版本
# mysql -V
mysql> select version();
- 7. 查看當前登錄的用戶。
mysql> select user();
- 8. 創建GBK字符集的數據庫oldboy,並查看已建庫完整語句
mysql> create database oldboy default character set gbk;
mysql> show create database oldboy;
- 9. 創建用戶oldboy,使之可以管理數據庫oldboy
mysql> grant select,update,insert,delete,alter on oldboy.* to oldboy@'localhost' identified by '123456';
- 10. 查看創建的用戶oldboy擁有哪些權限
mysql> show grants for oldboy@'localhost';
- 11. 查看當前數據庫里有哪些用戶
mysql> select user,host from mysql.user;
- 12. 進入oldboy數據庫
mysql> use oldboy();
- 13. 創建一個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. 查看建表結構及表結構的SQL語句
mysql> desc test;
mysql> show create table test\G
- 15. 插入一條數據“1,oldboy”
mysql> insert into test (id,name) values (1,'oldboy');
- 16. 再批量插入2行數據 “2,老男孩”,“3,oldboyedu”
mysql> insert into test (id,name) values (2,'老男孩'),(3,'oldboyedu');
- 17. 查詢名字為oldboy的記錄
mysql> select * from test where name='oldboy';
- 18. 把數據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. 不退出數據庫,完成備份oldboy數據庫
mysql> system mysqldump -uroot -p123456 -B -x -F --events oldboy >/opt/bak.sql
- 21. 刪除test表中的所有數據,並查看
mysql> delete from test;
- 22. 刪除表test和oldboy數據庫並查看
mysql> drop table test;
mysql> drop database oldboy;
- 23. 不退出數據庫恢復以上刪除的數據
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列設置為主鍵,在Name字段上創建普通索引。
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條記錄(自行設定數據)
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個字符創建普通索引
方法一:
mysql> alter table test add index index_shouji(shouji(8));
方法二:
mysql> create index index_shouji on test(shouji(8));
- 29. 查看創建的索引及索引類型等信息。
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個字符組建聯合索引。
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. 查詢上述語句的執行計划(是否使用聯合索引等)。
mysql> explain select * from test where name="oldboy" and shouji like "135%"\G
- 34. 把test表的引擎改成MyISAM。
mysql> alter table test engine=myisam; #myisam不區分大小寫
- 35. 收回oldboy用戶的select權限。
mysql> revoke select on oldboy.* from oldboy@'localhost';
- 36. 刪除oldboy用戶。
mysql> drop user oldboy@'localhost';
- 37. 刪除oldboy數據庫。
mysql> drop database oldboy;
- 38. 使用mysqladmin關閉數據庫。
mysqladmin -uroot -p123456 shutdown
- 39. MySQL密碼丟了,請找回?
# pkill mysql #先關閉mysql服務
#使用--skip-grant-tables啟動mysql,忽略授權登陸驗證
# mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables &
# mysql #此時再登陸,已經不需要密碼了
mysql> update mysql.user set password=password('abc123') where user='root' and host="localhost"; #設置新的密碼
mysql> flush privileges;
# mysql -uroot -pabc123 #再次用新設置的密碼登陸即可
二.MySQL運維基礎知識面試問答題
- 40. 請解釋關系型數據庫概念及主要特點?
概念:
關系型數據庫是支持采用了關系模型的數據庫,簡單來說,關系模型就是指二維表模型,而一個關系數據庫就是由二維表及其之間的聯系所組成的一個數據組織。
特點:
最大的特點就是事務的一致性。
優點:容易理解、使用方便、易於維護、支持SQL。
缺點:
- 高並發讀寫需求:網站的用戶並發非常高,往往達到每秒上萬次讀寫請求,對於傳統關系型數據庫來說,硬盤I/O是一個很大的瓶頸。
- 海量數據的高效讀寫:對於數據量巨大的網站來說,關系型數據庫的查詢效率非常低。
- 固定的表結構。
- 41. 請說出關系型數據庫的典型產品、特點及應用場景?
1.SQLserver
特點:真正的客戶機/服務器體系結構
圖形化用戶界面
豐富的編程接口工具
與Windows NT完全集成
具有很好的伸縮性
應用場景:
主機為Windows系統,主要應用於web網站的建設,承載中小型web后台數據。
2.MySQL
特點:體積小,總擁有成本低,開放源代碼,可運行在多數系統平台上,輕量級易擴展。
應用場景:廣泛的應用在Internet上的中小型網站中。
3.Oracle
特點:跨平台運行,安全性方面,性能最高。對硬件要求高,價格昂貴。
應用場景:大部分國企事業單位都用Oracle,在電信行業占用最大的份額。
- 42. 請解釋非關系型數據庫概念及主要特點?
- 使用鍵值對存儲數據,且結構不固定
- 一般不支持ACID特性。
- 基於鍵值對,數據沒有耦合性,容易擴展。
- 不提供SQL支持,學習和使用成本較高。
- 43. 請說出非關系型數據庫的典型產品、特點及應用場景?
MongoDB
特點:1.高性能,易部署,易使用。
2.面向集合存儲,易存儲對象類型的數據。
3.模式自由
4.自動處理碎片,以支持雲計算層次的擴展性。
應用場景:
網站數據:mongodb非常適合實時的插入,更新與查詢。
緩存:適合作為信息基礎設施的緩存層
大尺寸、低價值的數據
高伸縮性的場景
Redis
特點:1.性能極高,能支持超過100k+每秒的讀寫頻率
2.豐富的數據類型
3.所有操作都是原子性的
使用場景:
少量的數據存儲,高速讀寫訪問
SQLlite
特點:
1.嵌入式的,零配置,無需安裝和管理配置
2.ACID事務
3.存儲在單一磁盤文件中的一個完整的數據庫。
應用場景:
1.需要數據庫的小型桌面軟件。
2.需要數據庫的手機軟件。
3.作為數據容器的應用場景。
- 44. 請詳細描述SQL語句分類及對應代表性關鍵字。
(1)DDL(Data Definition Language)---數據庫定義語言(create、alter、drop),管理基礎數據庫,例如:庫,表
(2)DCL(Data Control Language)---數據控制語言(grant、revoke、commit、rollback),用戶授權,權限回收,數據提交回滾等
(3)DML(Data Manipulation Language)---數據操作語言(select、insert、delete、update),針對數據庫里的表,記錄
- 45. 請詳細描述char(4)和varchar(4)的差別。
char(4)定義的是固定長度4,存儲時,如果字符數不夠4位,會在后面用空格補全存入數據庫。
varchar(4)定義的是變長長度,存儲時,如果字符沒有達到定義的位數4時,也不會在后面補空格。
- 46. 如何授權oldboy用戶從172.16.1.0/24訪問數據庫。
mysql> grant all on *.* to oldboy@'172.16.1.%' identified by '123456';
- 47. 什么是MySQL多實例,如何配置MySQL多實例?
在一台服務器上,mysql服務開啟多個不同的端口,運行多個服務進程,這些mysql服務進程通過不同的socket來監聽不同的數據端口,進而互不干涉的提供各自的服務。
- 48. 如何加強MySQL安全,請給出可行的具體措施?
1.避免直接從互聯網訪問mysql數據庫,確保特定主機才擁有訪問權限。
2.定期備份數據庫
3.禁用或限制遠程訪問
在my.cnf文件里設置bind-address指定ip
4.移除test數據庫(默認匿名用戶可以訪問test數據庫)
5.禁用local infile
mysql> select load_file("/etc/passwd");
在my.cnf里[mysqld]下添加set-variable=local-infile=0
6.移除匿名賬戶和廢棄的賬戶
7.限制mysql數據庫用戶的權限
8.移除和禁用.mysql_history文件
# cat ~/.mysql_history
# export MYSQL_HISTFILE=/dev/null
- 49. delete和truncate刪除數據的區別?
truncate table test執行更快,清空物理文件,清空表中的所有內容
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參數作用?如何在線修改生效?
mysql執行排序使用的緩沖大小。如果想要增加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; #設置binlog過期時間為30天
手動清除
mysql> purge binary logs to "mysql-bin.000007"; #/刪除mysql-bin.000007之前的所有binlog日志
- 53. Binlog工作模式有哪些?各什么特點,企業如何選擇?
1.row level行級模式
優點:記錄數據詳細(每行),主從一致
缺點:占用大量的磁盤空間,降低了磁盤的性能
2.statement level模式(默認)
優點:記錄的簡單,內容少 ,節約了IO,提高性能 缺點:導致主從不一致
3.MIXED混合模式
結合了statement和row模式的優點,會根據執行的每一條具體的SQL語句來區分對待記錄的日志形式。對於函數,觸發器,存儲過程會自動使用row level模式
企業場景選擇:
1.互聯網公司使用mysql的功能較少(不用存儲過程、觸發器、函數),選擇默認的statement模式。
2.用到mysql的特殊功能(存儲過程、觸發器、函數)則選則MIXED模式
3.用到mysql的特殊功能(存儲過程、觸發器、函數),有希望數據最大化一致則選擇row模式。
- 54. 誤操作執行了一個drop庫SQL語句,如何完整恢復?
如果條件允許,操作前最好禁止外面一切服務器訪問mysql數據庫,這里假設禁止外面訪問數據庫,具體步驟如下:
- 手動切割binlog日志並記好切割好的binlog日志文件位置,這里假設為009,備份全部binlog日志
- 找到之前全備數據最后備份到的binlog文件位置並記好位置,這幾假設為005
- 用mysqladmin命令將005到008binlog文件中的SQL語句分離出來,並找到drop庫的語句將其刪掉
- 將之前全備數據導入mysql服務器
- 將步驟3中分離出的SQL語句導入mysql服務器
- 將009binlog文件刪除,再次刷新binlog日志,到此數據庫已恢復成功。
- 55. mysqldump備份使用了-A -B參數,如何實現恢復單表?
- 先用sed或awk將全庫中的需要的表結構過濾出來
sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `SC`/!d;q' /opt/bak_2017-12-07.sql
- 再用grep將全庫中相應的表內容過濾出來
grep 'INSERT INTO `SC`' /opt/bak_2017-12-07.sql
- 將1和2中過濾出來的SQL語句導入數據庫即可
- 詳述MySQL主從復制原理及配置主從的完整步驟。
主從復制原理:
- 主:binlog線程,記錄所有改變了數據庫數據的語句,放進master上的binlog中
- 從:IO線程,在使用start slave之后,負責從master上拉取binlog內容,放進自己的relay log中
- 從:SQL執行線程,執行relay log中的語句。
配置步驟:
- 主庫開啟binlog日志功能
- 全備數據庫,記錄好binlog文件和相應的位置
- 從庫上配置和主庫的連接信息
- 將全備數據導入從庫
- 從庫啟動slave
- 在從庫上查看同步狀態,確認是否同步成功
- 57. 如何開啟從庫的binlog功能?
在my.cnf文件中寫入log-bin=mysql-bin
- 58. MySQL如何實現雙向互為主從復制,並說明應用場景?
兩台數據庫都開啟binlog功能,相互為主從配置。
雙主的實現方式主要有兩種:
- 讓表的ID自增,然后主1寫1、3、5,主2寫2、4、6
- 不讓表的ID自增,然后通過web端程序去seq服務器取ID,寫入雙主。
雙主工作場景為高並發寫的場景,慎用。
- 59. MySQL如何實現級聯同步,並說明應用場景?
第一台數據庫開啟binlog功能設為主服務器,第二台數據庫也開啟binlog功能,設為第一台服務器的從服務器,設為其他數據庫的主服務器
- 60. MySQL主從復制故障如何解決?
解決辦法1:
登陸從庫上操作:
- stop slave 臨時停止同步開關
- set global sql_slave_skip_counter=1,將同步指針向下移動一個,也可以多個,如果多次不同步,可以重復操作。
- start slave,重啟主從復制開關
解決辦法2:
在my.cnf配置文件中加入參數
slave-skip-errors=1032,1062,1007
- 61. 如何監控主從復制是否故障?
查看slave端的IO和SQL進程狀態是否OK,同步延遲時間是否小於1分鍾
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
- 62. MySQL數據庫如何實現讀寫分離?
- 通過程序實現讀寫分離(性能,效率最佳,推薦
PHP和Java程序都可以通過設置多個連接文件輕松的實現對數據庫的讀寫分離,即當select時,就去連接讀庫的連接文件,當update、insert、delete是就去連接寫庫的連接文件。
- 通過軟件實現讀寫分離
MySQL-proxy,Amoeba等代理軟件也可以實現讀寫分離功能,但最常用最好用的還是程序實現讀寫分離。
- 開發dbproxy
- 63. 生產一主多從從庫宕機,如何手工恢復?
處理方法:重做slave
- 停止slave
- 導入備份數據
- 配置master.info信息
- 啟動slave
- 檢查從庫狀態
- 64. 生產一主多從主庫宕機,如何手工恢復?
主庫宕機分為數據庫宕機和服務器宕機2種,不管哪種都要進行主從切換。
1.登陸從庫檢查IO線程和SQL線程狀態show processlist\G,確認SQL線程已讀完所有relay-log
2.登陸所有從庫檢查master.info信息,查看哪個從庫的binlog文件和位置是最新的,選擇最新的從庫切換為主庫(或利用半同步功能,直接選擇做了實時同步的從庫為主庫)
3.如果主庫只是數據庫宕了,服務器還在運行,則可以把binlog拉取到提升為主庫的從庫應用。
4.登陸要切換為主庫的從庫,進行切換操作。
stop slave;reset master;quit
5.進入要切換的從庫數據目錄,刪除master.info和relay-log.info文件,並檢查授權表,read_only等參數
6.修改my.cnf配置文件,開啟binlog,注釋從庫參數
log-bin=/data/3307/mysql-bin
#log-slave-updates
#read-only
- 對同步用戶進行提權,保證權限與主庫用戶權限一樣
- 重啟數據庫提生為主庫
- 其他從庫操作
(1) 檢查運行環境和用戶
(2) 停止從庫,修改master信息
(3) 啟動從庫同步,檢查同步狀態
- 修改web程序的連接配置,從原主庫指向新主庫
- 維護損壞的主庫,完成后作為從庫使用,或切換回來
- 如果主庫沒有宕機,只是想按計划切換一下主庫,就非常簡單
(1) 主庫鎖表
(2) 登陸所有從庫檢查同步狀態,查看是否完成同步。
(3) 其他按上面步驟進行切換
- 65. MySQL出現復制延遲有哪些原因?如何解決?
- 一個主庫的從庫太多,導致復制延遲
建議從庫數量3-5個為宜,要復制的從節點數量過多,會導致復制延遲
- 從庫硬件比主庫差,導致復制延遲
查看master和slave的系統配置,可能會因為機器配置問題,包括磁盤IO、CPU、內存等各方面因素造成復制的延遲,一般發生在高並發大數據量的寫入場景。
- 慢SQL語句過多
假如一條SQL語句執行時間是20秒,那么執行完畢到從庫上能查到數據也至少是20秒,可以修改后分多次寫入,通過查看慢查詢日志或show full processlist命令找出執行時間長的查詢語句或者大的事務。
- 主從復制設計問題
主從復制單線程,如果主庫寫並發太大,來不及傳送到從庫就會導致延遲。更高版本的mysql可以支持多線程復制,門戶網站則會自己開發多線程同步功能。
- 主從庫之間網絡延遲
主從庫的網卡,網線,連接的交換機等網絡設備都可能成為復制的瓶頸,導致復制延遲,另外,跨公網主從復制很容易導致主從復制延遲。
- 主庫讀寫壓力大,導致復制延遲
主庫硬件要搞好一點,架構的前端要加buffer。
- 66. 給出企業生產大型MySQL集群架構可行備份方案?
- 利用mysqldump做定時備份,根據情況可按天或按周做全庫備份。
- 用rsync+inotify對主庫binlog做實時備份
- 67. 什么是數據庫事務,事務有哪些特性?企業如何選擇?
事務就是指邏輯上的一組SQL語句操作,組成這組操作的各個SQL語句,執行時要么全成功要么全失敗。
事務的四大特性(ACID):
- 原子性(atomicity)
整個事務的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
- 一致性(consistency)
事務發生前和發生后,數據的完整性必須保持一致
- 隔離性(isolation)
當並發訪問數據庫時,一個正在執行的事務在執行完畢前,對於其他的會話是不可見的,多個並發事務之間的數據是相互隔離的。
- 持久性(durability)
一個事務一旦被提交,它對數據庫中的數據改變就是永久性的,如果出了錯誤,事務也不允許撤銷。
- 68. 請解釋全備、增備、冷備、熱備概念及企業實踐經驗?
全備:備份數據庫所有數據
增備:一次性備份所有數據,然后再增量備份。
冷備:需要關閉mysql服務,讀寫請求均不允許狀態下進行。
溫備:服務在線,但僅支持讀請求,不允許寫請求的情況下備份。
熱備:備份的同時,業務不受影響。
- 69. MySQL的SQL語句如何優化?
- 在表中建立索引,優先考慮where、group by使用到的字段
- 盡量避免使用select *,返回無用的字段會降低查詢效率
- 盡量避免使用in和not in,會導致數據庫引擎放棄索引進行全表掃描
- 盡量避免使用or,會導致數據庫引擎放棄索引進行全表掃描
- 盡量避免在字段開頭模糊查詢,會導致數據庫引擎放棄索引進行全表掃描
- 70. MySQL中MyISAM與InnoDB的區別,至少5點
(1) 問5點不同
- InnoDB支持事務,而MyISAM不支持事務。
- InnoDB支持行級鎖,而MyISAM支持表級鎖
- InnoDB支持MVCC,而MyISAM不支持
- InnoDB支持外鍵,而MyISAM不支持
- InnoDB不支持全文索引,而MyISAM支持
(2) InnoDB引擎的3大特性
插入緩存(insert buffer)、二次寫(double write)、自適應哈希索引(ahi)、預讀(read ahead)(3)二者select count(*)哪個更快,為什么?
MyISAM更快,因為MyISAM內部維護了一個計數器,可以直接調取。
面試題035:開發有一堆數據發給dba執行,DBA執行需注意什么?
- 71. 如何調整生產線中MySQL數據庫的字符集。
- 修改my.cnf文件中的字符集配置
- 查看當前字符集設置
mysql> show global variables like "character%";
- 用set分別設置字符集變量值
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里中文數據亂碼原理,如何防止亂碼?
mysql客戶端 mysql服務端 操作系統等字符集不一致導致的亂碼,將上述字符集調成一致。
- 73. 企業生產MySQL如何優化(請多角度描述)?
- 硬件優化
CPU、內存、磁盤、網卡
- 軟件優化
(1) 操作系統:64位,內核優化
(2) MySQL編譯安裝、優化
- my.cnf里的參數優化
- 74. MySQL高可用方案有哪些,各自特點,企業如何選擇?
- 主從復制+讀寫分離
優點:成本低、架構簡單、易實施、維護方便
缺點:master出現問題后不能自動到slave上,需要人工干涉。
- MySQL Cluster
優點:安全性高,穩定性高。可以在線增加節點
缺點:架構復雜,至少三個節點,對於引擎只能用ndb,不支持外鍵,管理復雜,部署費時而且是收費的。
- Heartbeat /keepalived+雙主從復制
優點:安全性、穩定性高,出現故障系統將自動切換,從而保證服務的連續性。
缺點:可能會發生腦裂
- HeartBeat+DRBD+MySQL
優點:安全性、穩定性、出現故障系統將自動切換,從而保證服務的連續性。
缺點:只用一台服務器提供服務,成本高,可能發生腦裂
- 75. 如何分表分庫備份及批量恢復(口述腳本實現過程)?
備份庫:
mysqldump -u 用戶名 -p 密碼 數據庫名 >備份的文件名
備份表
mysqldump -u 用戶名 -p 密碼 數據庫名 表名 >備份的文件名
面試題041:如何批量更改數據庫表的引擎?
#!/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 table $n engine=myisam"
done
- 如何批量更改數據庫字符集?
#!/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. 網站打開慢,請給出排查方法,如是數據庫慢導致,如何排查並解決,請分析並舉例?
- 檢查操作系統是否負載過高
- 登陸mysql查看有哪些sql語句占用時間過長,show processlist;
- 用explain查看消耗時間過長的SQL語句是否走了索引
- 對SQL語句優化,建立索引
- 78. xtranbackup的備份、增量備份及恢復的工作原理?
XtraBackup基於InnoDB的crash-recovery功能,它會復制InnoDB的data file,由於不鎖表,復制出來的數據是不一致的,在恢復的時候使用crash-recovery,使得數據恢復一致。
InnoDB維護了一個redo log,又稱為transaction log(事務日志),它包含了InnoDB數據的所有改動情況。當InnoDB啟動的時候,它會先去檢查data file和transaction log,並且會做兩步操作:
XtraBackup在備份的時候,一頁一頁的復制InnoDB的數據,而且不鎖定表,與此同時,XtraBackup還有另外一個線程監視着transaction log,一旦log發生變化,就把變化過的log pages復制走。為什么要着急復制走呢?因為transaction log文件大小有限,寫滿之后,就會從頭再開始寫,所以新數據可能會覆蓋到舊的數據。
在prepare過程中,XtraBackup使用復制到的transaction log對備份出來的InnoDB data file進行crash recovery
- 79. 誤執行drop數據,如何通過xtrabackup恢復?
- 關閉mysql服務
- 移除mysql的data目錄及數據
- 將備份的數據恢復到mysql的data目錄
- 啟動mysql服務
- 如何做主從數據一致性校驗?
主從一致性校驗有多種工具 例如checksum、mysqldiff、pt-table-checksum等
- 81. 如何監控MySQL的增刪改查次數?
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(說出關鍵命令)
mysqld_safe --defaults-file=/data/3306/my.cnf &
- 84. 如何自定義腳本平滑關閉MySQL(說出關鍵命令)
mysqladmin -u root-p123456 -S /data/3306/mysql.sock shutdown
- 85. 你們的公司如何實現數據庫讀寫分離的?
通過程序實現的讀寫分離
insert、update、delete、alter等走主庫,select等走從庫
- mysqldump導入導出默認把所有數據都縮減在一行里面,為了查看和修改方便,如何將數據以多行插入的形式導出。
用--skip-extend-insert選項
- 87. 你是如何監控你能數據庫的?
開源監控工具有很多,如zabbix,nagios
Lepus(天兔):簡潔、直觀、強大的開源數據庫監控系統,MySQL/Oracle/MongoDB/Redis一站式性能監控,讓數據庫監控更簡單
- 公司現有的數據庫架構,總共有幾組mysql庫?
我們公司現在有兩組MySQL。其中一套是生產庫,一套是測試庫。
生產庫和測試庫都是用的mha +半同步復制做的高可用。
我們所有的項目web前端量(大概有10個項目)指向的都是一個機器上的mysql實例。因為我們是傳統行業,並發訪問量並不是很大,所以目前我們的生產mysql數據庫未出現性能問題。
- mysql的權限怎么管理?
只給insert,update,select和delete四個權限即可。有時候delete都不給。
90. 如果發現CPU,或者IO壓力很大,怎么定位問題?
1、首先我會用top命令和iostat命令,定位是什么進程在占用cpu和磁盤io;
2、如果是mysql的問題,我會登錄到數據庫,通過show full processlist命令,看現在數據庫在執行什么sql語句,是否有語句長時間執行使數據庫卡住;
3、執行show engine innodb status\G命令,查看數據庫是否有鎖資源爭用;
4、查看mysql慢查詢日志,看是否有慢sql;
5、找到引起數據庫占用資源高的語句,進行優化,該建索引的建索引,索引不合適的刪索引,或者根據情況kill掉耗費資源的sql語句等