1. 程式人生 > >關於MySQL資料庫面試題

關於MySQL資料庫面試題

一.基礎筆試命令考察

  1.   開啟MySQL服務
    

service mysqld start

/init.d/mysqld start

safe_mysql &

關閉mysql服務

service mysqld stop

/etc/init.d/mysqld stop

mysqladmin -uroot -p123456 shutdown

  1.   檢測埠是否執行
    

lsof -i:3306

netstat -tunlp|grep 3306

ss -tulnp|grep 3306

  1.   為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’);

  1.   登陸MySQL資料庫。
    

單例項登陸

mysql -uroot -p123456

多例項登陸

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

  1.   檢視當前資料庫的字符集
    

mysql> show variables like “%charac%”;

  1.   檢視當前資料庫版本
    

mysql -V

mysql> select version();

  1.   檢視當前登入的使用者。
    

mysql> select user();

  1.   建立GBK字符集的資料庫oldboy,並檢視已建庫完整語句
    

mysql> create database oldboy default character set gbk;

mysql> show create database oldboy;

  1.   建立使用者oldboy,使之可以管理資料庫oldboy
    

mysql> grant select,update,insert,delete,alter on oldboy.* to

[email protected]‘localhost’ identified by ‘123456’;

  1. 檢視建立的使用者oldboy擁有哪些許可權

mysql> show grants for [email protected]‘localhost’;

  1. 檢視當前資料庫裡有哪些使用者

mysql> select user,host from mysql.user;

  1. 進入oldboy資料庫

mysql> use oldboy();

  1. 建立一個innodb GBK表test,欄位id int(4)和name varchar(16)

mysql> create table test (id int(4),name varchar(16)) engine=InnoDB default charset=gbk;

  1. 檢視建表結構及表結構的SQL語句

mysql> desc test;

mysql> show create table test\G

  1. 插入一條資料“1,oldboy”

mysql> insert into test (id,name) values (1,‘oldboy’);

  1. 再批量插入2行資料 “2,老男孩”,“3,oldboyedu”

mysql> insert into test (id,name) values (2,‘老男孩’),(3,‘oldboyedu’);

  1. 查詢名字為oldboy的記錄

mysql> select * from test where name=‘oldboy’;

  1. 把資料id等於1的名字oldboy更改為oldgirl

mysql> update test set name=‘oldgirl’ where id=1;

  1. 在欄位name前插入age欄位,型別tinyint(2)

mysql> alter table test add age tinyint(2) after id;

  1. 不退出資料庫,完成備份oldboy資料庫

mysql> system mysqldump -uroot -p123456 -B -x -F --events oldboy >/opt/bak.sql

  1. 刪除test表中的所有資料,並檢視

mysql> delete from test;

  1. 刪除表test和oldboy資料庫並檢視

mysql> drop table test;

mysql> drop database oldboy;

  1. 不退出資料庫恢復以上刪除的資料

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

  1. 把庫表的GBK字符集修改為UTF8

mysql> alter database oldboy default character set utf8;

mysql> alter table test default character set utf8;

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

  1. 在欄位name後插入手機號欄位(shouji),型別char(11)。

mysql> alter table test add shouji char(11) after name;

  1. 所有欄位上插入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’);

  1. 在手機欄位上對前8個字元建立普通索引

方法一:

mysql> alter table test add index index_shouji(shouji(8));

方法二:

mysql> create index index_shouji on test(shouji(8));

  1. 檢視建立的索引及索引型別等資訊。

mysql> show index from test\G

  1. 刪除Name,shouji列的索引。

mysql> alter table test drop index index_name;

mysql> alter table test drop index index_shouji;

  1. 對Name列的前6個字元以及手機列的前8個字元組建聯合索引。

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

  1. 查詢手機號以135開頭的,名字為oldboy的記錄(提前插入)。

mysql> select * from test where name=‘oldboy’ and shouji like “135%”;

  1. 查詢上述語句的執行計劃(是否使用聯合索引等)。

mysql> explain select * from test where name=“oldboy” and shouji like “135%”\G

  1. 把test表的引擎改成MyISAM。

mysql> alter table test engine=myisam; #myisam不區分大小寫

  1. 收回oldboy使用者的select許可權。

mysql> revoke select on oldboy.* from [email protected]‘localhost’;

  1. 刪除oldboy使用者。

mysql> drop user [email protected]‘localhost’;

  1. 刪除oldboy資料庫。

mysql> drop database oldboy;

  1. 使用mysqladmin關閉資料庫。

mysqladmin -uroot -p123456 shutdown

  1. 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運維基礎知識面試問答題

  1. 請解釋關係型資料庫概念及主要特點?

概念:

關係型資料庫是支援採用了關係模型的資料庫,簡單來說,關係模型就是指二維表模型,而一個關係資料庫就是由二維表及其之間的聯絡所組成的一個數據組織。

特點:

最大的特點就是事務的一致性。

優點:容易理解、使用方便、易於維護、支援SQL。

缺點:

  1.   高併發讀寫需求:網站的使用者併發非常高,往往達到每秒上萬次讀寫請求,對於傳統關係型資料庫來說,硬碟I/O是一個很大的瓶頸。
    
  2.   海量資料的高效讀寫:對於資料量巨大的網站來說,關係型資料庫的查詢效率非常低。
    
  3.   固定的表結構。
    
  4. 請說出關係型資料庫的典型產品、特點及應用場景?

1.SQLserver

特點:真正的客戶機/伺服器體系結構

  圖形化使用者介面

  豐富的程式設計介面工具

  與Windows NT完全整合

  具有很好的伸縮性

應用場景:

主機為Windows系統,主要應用於web網站的建設,承載中小型web後臺資料。

2.MySQL

特點:體積小,總擁有成本低,開放原始碼,可執行在多數系統平臺上,輕量級易擴充套件。

應用場景:廣泛的應用在Internet上的中小型網站中。

3.Oracle

特點:跨平臺執行,安全性方面,效能最高。對硬體要求高,價格昂貴。

應用場景:大部分國企事業單位都用Oracle,在電信行業佔用最大的份額。

  1. 請解釋非關係型資料庫概念及主要特點?

  2.   使用鍵值對儲存資料,且結構不固定
    
  3.   一般不支援ACID特性。
    
  4.   基於鍵值對,資料沒有耦合性,容易擴充套件。
    
  5.   不提供SQL支援,學習和使用成本較高。
    
  6. 請說出非關係型資料庫的典型產品、特點及應用場景?

MongoDB

特點:1.高效能,易部署,易使用。

  2.面向集合儲存,易儲存物件型別的資料。

  3.模式自由

  4.自動處理碎片,以支援雲端計算層次的擴充套件性。

應用場景:

  網站資料:mongodb非常適合實時的插入,更新與查詢。

  快取:適合作為資訊基礎設施的快取層

  大尺寸、低價值的資料

  高伸縮性的場景

Redis

特點:1.效能極高,能支援超過100k+每秒的讀寫頻率

  2.豐富的資料型別

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

使用場景:

  少量的資料儲存,高速讀寫訪問

SQLlite

特點:

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

2.ACID事務

3.儲存在單一磁碟檔案中的一個完整的資料庫。

應用場景:

1.需要資料庫的小型桌面軟體。

2.需要資料庫的手機軟體。

3.作為資料容器的應用場景。

  1. 請詳細描述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),針對資料庫裡的表,記錄

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

char(4)定義的是固定長度4,儲存時,如果字元數不夠4位,會在後面用空格補全存入資料庫。

varchar(4)定義的是變長長度,儲存時,如果字元沒有達到定義的位數4時,也不會在後面補空格。

  1. 如何授權oldboy使用者從172.16.1.0/24訪問資料庫。

mysql> grant all on . to [email protected]‘172.16.1.%’ identified by ‘123456’;

  1. 什麼是MySQL多例項,如何配置MySQL多例項?

在一臺伺服器上,mysql服務開啟多個不同的埠,執行多個服務程序,這些mysql服務程序通過不同的socket來監聽不同的資料埠,進而互不干涉的提供各自的服務。

  1. 如何加強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

  1. delete和truncate刪除資料的區別?

truncate table test執行更快,清空物理檔案,清空表中的所有內容

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

  1. 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. sort_buffer_size引數作用?如何線上修改生效?

mysql執行排序使用的緩衝大小。如果想要增加order by的速度,首先看是否可以讓mysql使用索引而不是額外的排序階段,如果不能,可以嘗試增加sort_buffer_size變數的大小。

mysql> set global sort_buffer_size =131072; #單位為B,即128KB,預設64K

  1. 如何線上正確清理MySQL binlog?

自動清除

mysql> set global expire_logs_days=30; #設定binlog過期時間為30天

手動清除

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

  1. Binlog工作模式有哪些?各什麼特點,企業如何選擇?

1.row level行級模式

優點:記錄資料詳細(每行),主從一致

缺點:佔用大量的磁碟空間,降低了磁碟的效能

2.statement level模式(預設)

優點:記錄的簡單,內容少 ,節約了IO,提高效能 缺點:導致主從不一致

3.MIXED混合模式

結合了statement和row模式的優點,會根據執行的每一條具體的SQL語句來區分對待記錄的日誌形式。對於函式,觸發器,儲存過程會自動使用row level模式

企業場景選擇:

1.網際網路公司使用mysql的功能較少(不用儲存過程、觸發器、函式),選擇預設的statement模式。

2.用到mysql的特殊功能(儲存過程、觸發器、函式)則選則MIXED模式

3.用到mysql的特殊功能(儲存過程、觸發器、函式),有希望資料最大化一致則選擇row模式。

  1. 誤操作執行了一個drop庫SQL語句,如何完整恢復?

如果條件允許,操作前最好禁止外面一切伺服器訪問mysql資料庫,這裡假設禁止外面訪問資料庫,具體步驟如下:

  1.   手動切割binlog日誌並記好切割好的binlog日誌檔案位置,這裡假設為009,備份全部binlog日誌
    
  2.   找到之前全備資料最後備份到的binlog檔案位置並記好位置,這幾假設為005
    
  3.   用mysqladmin命令將005到008binlog檔案中的SQL語句分離出來,並找到drop庫的語句將其刪掉
    
  4.   將之前全備資料匯入mysql伺服器
    
  5.   將步驟3中分離出的SQL語句匯入mysql伺服器
    
  6.   將009binlog檔案刪除,再次重新整理binlog日誌,到此資料庫已恢復成功。
    
  7. mysqldump備份使用了-A -B引數,如何實現恢復單表?

  8.   先用sed或awk將全庫中的需要的表結構過濾出來
    

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

  1.   再用grep將全庫中相應的表內容過濾出來
    

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

  1.   將1和2中過濾出來的SQL語句匯入資料庫即可
    
  2. 詳述MySQL主從複製原理及配置主從的完整步驟。

主從複製原理:

                                          mysql主從複製原理圖-2017-12-8.jpg
  1.   主:binlog執行緒,記錄所有改變了資料庫資料的語句,放進master上的binlog中
    
  2.   從:IO執行緒,在使用start slave之後,負責從master上拉取binlog內容,放進自己的relay log中
    
  3.   從:SQL執行執行緒,執行relay log中的語句。
    

配置步驟:

  1.   主庫開啟binlog日誌功能
    
  2.   全備資料庫,記錄好binlog檔案和相應的位置
    
  3.   從庫上配置和主庫的連線資訊
    
  4.   將全備資料匯入從庫
    
  5.   從庫啟動slave
    
  6.   在從庫上檢視同步狀態,確認是否同步成功
    
  7. 如何開啟從庫的binlog功能?

在my.cnf檔案中寫入log-bin=mysql-bin

  1. MySQL如何實現雙向互為主從複製,並說明應用場景?

兩臺資料庫都開啟binlog功能,相互為主從配置。

雙主的實現方式主要有兩種:

  1.   讓表的ID自增,然後主1寫1、3、5,主2寫2、4、6
    
  2.   不讓表的ID自增,然後通過web端程式去seq伺服器取ID,寫入雙主。
    

雙主工作場景為高併發寫的場景,慎用。

  1. MySQL如何實現級聯同步,並說明應用場景?

第一臺資料庫開啟binlog功能設為主伺服器,第二臺資料庫也開啟binlog功能,設為第一臺伺服器的從伺服器,設為其他資料庫的主伺服器

  1. MySQL主從複製故障如何解決?

解決辦法1:

登陸從庫上操作:

  1.   stop slave 臨時停止同步開關
    
  2.   set global sql_slave_skip_counter=1,將同步指標向下移動一個,也可以多個,如果多次不同步,可以重複操作。
    
  3.   start slave,重啟主從複製開關
    

解決辦法2:

在my.cnf配置檔案中加入引數

slave-skip-errors=1032,1062,1007

  1. 如何監控主從複製是否故障?

檢視slave端的IO和SQL程序狀態是否OK,同步延遲時間是否小於1分鐘

mysql> show slave status\G

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Seconds_Behind_Master: 0

  1. MySQL資料庫如何實現讀寫分離?

  2.   通過程式實現讀寫分離(效能,效率最佳,推薦
    

PHP和Java程式都可以通過設定多個連線檔案輕鬆的實現對資料庫的讀寫分離,即當select時,就去連線讀庫的連線檔案,當update、insert、delete是就去連線寫庫的連線檔案。

  1.   通過軟體實現讀寫分離
    

MySQL-proxy,Amoeba等代理軟體也可以實現讀寫分離功能,但最常用最好用的還是程式實現讀寫分離。

  1.   開發dbproxy
    
  2. 生產一主多從從庫宕機,如何手工恢復?

處理方法:重做slave

  1.   停止slave
    
  2.   匯入備份資料
    
  3.   配置master.info資訊
    
  4.   啟動slave
    
  5.   檢查從庫狀態
    
  6. 生產一主多從主庫宕機,如何手工恢復?

主庫宕機分為資料庫宕機和伺服器宕機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.   重啟資料庫提生為主庫
    
  3.   其他從庫操作
    

(1) 檢查執行環境和使用者

(2) 停止從庫,修改master資訊

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

  1. 修改web程式的連線配置,從原主庫指向新主庫

  2. 維護損壞的主庫,完成後作為從庫使用,或切換回來

  3. 如果主庫沒有宕機,只是想按計劃切換一下主庫,就非常簡單

(1) 主庫鎖表

(2) 登陸所有從庫檢查同步狀態,檢視是否完成同步。

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

  1. MySQL出現複製延遲有哪些原因?如何解決?

  2.   一個主庫的從庫太多,導致複製延遲
    

建議從庫數量3-5個為宜,要複製的從節點數量過多,會導致複製延遲

  1.   從庫硬體比主庫差,導致複製延遲
    

檢視master和slave的系統配置,可能會因為機器配置問題,包括磁碟IO、CPU、記憶體等各方面因素造成複製的延遲,一般發生在高併發大資料量的寫入場景。

  1.   慢SQL語句過多
    

假如一條SQL語句執行時間是20秒,那麼執行完畢到從庫上能查到資料也至少是20秒,可以修改後分多次寫入,通過檢視慢查詢日誌或show full processlist命令找出執行時間長的查詢語句或者大的事務。

  1.   主從複製設計問題
    

主從複製單執行緒,如果主庫寫併發太大,來不及傳送到從庫就會導致延遲。更高版本的mysql可以支援多執行緒複製,入口網站則會自己開發多執行緒同步功能。

  1.   主從庫之間網路延遲
    

主從庫的網絡卡,網線,連線的交換機等網路裝置都可能成為複製的瓶頸,導致複製延遲,另外,跨公網主從複製很容易導致主從複製延遲。

  1.   主庫讀寫壓力大,導致複製延遲
    

主庫硬體要搞好一點,架構的前端要加buffer。

  1. 給出企業生產大型MySQL叢集架構可行備份方案?

  2.   利用mysqldump做定時備份,根據情況可按天或按周做全庫備份。
    
  3.   用rsync+inotify對主庫binlog做實時備份
    
  4. 什麼是資料庫事務,事務有哪些特性?企業如何選擇?

事務就是指邏輯上的一組SQL語句操作,組成這組操作的各個SQL語句,執行時要麼全成功要麼全失敗。

事務的四大特性(ACID):

  1.   原子性(atomicity)
    

整個事務的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  1.   一致性(consistency)
    

事務發生前和發生後,資料的完整性必須保持一致

  1.   隔離性(isolation)
    

當併發訪問資料庫時,一個正在執行的事務在執行完畢前,對於其他的會話是不可見的,多個併發事務之間的資料是相互隔離的。

  1.   永續性(durability)
    

一個事務一旦被提交,它對資料庫中的資料改變就是永久性的,如果出了錯誤,事務也不允許撤銷。

  1. 請解釋全備、增備、冷備、熱備概念及企業實踐經驗?

全備:備份資料庫所有資料

增備:一次性備份所有資料,然後再增量備份。

冷備:需要關閉mysql服務,讀寫請求均不允許狀態下進行。

溫備:服務線上,但僅支援讀請求,不允許寫請求的情況下備份。

熱備:備份的同時,業務不受影響。

  1. MySQL的SQL語句如何優化?

  2.   在表中建立索引,優先考慮where、group by使用到的欄位
    
  3.   儘量避免使用select *,返回無用的欄位會降低查詢效率
    
  4.   儘量避免使用in和not in,會導致資料庫引擎放棄索引進行全表掃描
    
  5.   儘量避免使用or,會導致資料庫引擎放棄索引進行全表掃描
    
  6.   儘量避免在欄位開頭模糊查詢,會導致資料庫引擎放棄索引進行全表掃描
    
  7. MySQL中MyISAM與InnoDB的區別,至少5點

(1) 問5點不同

a. InnoDB支援事務,而MyISAM不支援事務。

b. InnoDB支援行級鎖,而MyISAM支援表級鎖

c. InnoDB支援MVCC,而MyISAM不支援

d. InnoDB支援外來鍵,而MyISAM不支援

e. InnoDB不支援全文索引,而MyISAM支援

(2) InnoDB引擎的3大特性

插入快取(insert buffer)、二次寫(double write)、自適應雜湊索引(ahi)、預讀(read ahead)(3)二者select count(*)哪個更快,為什麼?

MyISAM更快,因為MyISAM內部維護了一個計數器,可以直接調取。

面試題035:開發有一堆資料發給dba執行,DBA執行需注意什麼?

  1. 如何調整生產線中MySQL資料庫的字符集。

  2.   修改my.cnf檔案中的字符集配置
    
  3.   檢視當前字符集設定
    

mysql> show global variables like “character%”;

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

  1. 請描述MySQL裡中文資料亂碼原理,如何防止亂碼?

mysql客戶端 mysql服務端 作業系統等字符集不一致導致的亂碼,將上述字符集調成一致。

  1. 企業生產MySQL如何優化(請多角度描述)?

  2.   硬體優化
    

CPU、記憶體、磁碟、網絡卡

  1.   軟體優化
    

(1) 作業系統:64位,核心優化

(2) MySQL編譯安裝、優化

  1.   my.cnf裡的引數優化
    
  2. MySQL高可用方案有哪些,各自特點,企業如何選擇?

  3.   主從複製+讀寫分離
    

優點:成本低、架構簡單、易實施、維護方便

缺點:master出現問題後不能自動到slave上,需要人工干涉。

  1.   MySQL Cluster
    

優點:安全性高,穩定性高。可以線上增加節點

缺點:架構複雜,至少三個節點,對於引擎只能用ndb,不支援外來鍵,管理複雜,部署費時而且是收費的。

  1.   Heartbeat /keepalived+雙主從複製
    

優點:安全性、穩定性高,出現故障系統將自動切換,從而保證服務的連續性。

缺點:可能會發生腦裂

  1.   HeartBeat+DRBD+MySQL
    

優點:安全性、穩定性、出現故障系統將自動切換,從而保證服務的連續性。

缺點:只用一臺伺服器提供服務,成本高,可能發生腦裂

  1. 如何分表分庫備份及批量恢復(口述指令碼實現過程)?

備份庫:

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

  1. 如何批量更改資料庫字符集?

#!/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

  1. 網站開啟慢,請給出排查方法,如是資料庫慢導致,如何排查並解決,請分析並舉例?

  2.   檢查作業系統是否負載過高
    
  3.   登陸mysql檢視有哪些sql語句佔用時間過長,show processlist;
    
  4.   用explain檢視消耗時間過長的SQL語句是否走了索引
    
  5.   對SQL語句優化,建立索引
    
  6. 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

  1. 誤執行drop資料,如何通過xtrabackup恢復?

  2.   關閉mysql服務
    
  3.   移除mysql的data目錄及資料
    
  4.   將備份的資料恢復到mysql的data目錄
    
  5.   啟動mysql服務
    
  6. 如何做主從資料一致性校驗?

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

  1. 如何監控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)

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

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

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

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

組合索引:就是將多個欄位建到一個索引裡。

  1. 如何自定義指令碼啟動MySQL(說出關鍵命令)

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

  1. 如何自定義指令碼平滑關閉MySQL(說出關鍵命令)

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

  1. 你們的公司如何實現資料庫讀寫分離的?

通過程式實現的讀寫分離

insert、update、delete、alter等走主庫,select等走從庫

  1. mysqldump匯入匯出預設把所有資料都縮減在一行裡面,為了檢視和修改方便,如何將資料以多行插入的形式匯出。

用–skip-extend-insert選項

  1. 你是如何監控你能資料庫的?

開源監控工具有很多,如zabbix,nagios

Lepus(天兔):簡潔、直觀、強大的開源資料庫監控系統,MySQL/Oracle/MongoDB/Redis一站式效能監控,讓資料庫監控更簡單

  1. 公司現有的資料庫架構,總共有幾組mysql庫?

我們公司現在有兩組MySQL。其中一套是生產庫,一套是測試庫。

生產庫和測試庫都是用的mha +半同步複製做的高可用。
我們所有的專案web前端量(大概有10個專案)指向的都是一個機器上的mysql例項。因為我們是傳統行業,併發訪問量並不是很大,所以目前我們的生產mysql資料庫未出現效能問題。

  1. mysql的許可權怎麼管理?
    只給insert,update,select和delete四個許可權即可。有時候delete都不給。

  2. 如果發現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語句等