@所有人 第六週基礎部分作業:
- 總結關係型資料庫相關概念,關係,行,列,主鍵,惟一鍵,域。
關係型資料庫:以二維表的方式記錄資料。
關係relational:每張表;
行row:record,每條記錄;
列column:field,每個欄位、屬性;
主鍵Primary key:PK,唯一確定每條記錄的欄位,所以每個表只有一個主鍵且不能空,一般使用**id自增確保不會重複;
唯一鍵Unique key:UK,有意義的唯一確定每條記錄的欄位,可以用多個屬性、欄位組合,一張表可以有多個,且可以為NULL;
域domain:欄位、屬性的取值範圍;如性別為男或女,年齡為0到150;
- 總結關聯型別,1對1,1對多,多對多關係。可以自行設計表進行解釋。
1:1 :A表的UK欄位field,對應B表的主鍵PK;
1:N :A表的PK、UK欄位,對應B表的非唯一欄位;邏輯清晰;
N:M :A表的非唯一欄位,對應B表的非唯一欄位;容易造成混亂,增加一張1:N的表;
- 總結mysql設計正規化
目的:為了減少資料庫中的冗餘,增進資料的一致性。
第一正規化,1NF:每一列、每個屬性都是基本資料項,確保原子性、非重複值,屬性唯一。關聯式資料庫必須滿足1NF。
第二正規化,2NF:滿足1NF,且每個屬性完全依賴PK。
第三正規化,3NF:滿足2NF,且每個屬性間無關係。
- 總結Mysql多種安裝方式,及安全加固,並總結mysql配置檔案。
完成將server和client端的mysql配置預設字符集為utf8mb4;
yum安裝 配置好源即可,安裝mysql-server,mariadb-server服務端 |
https://dev.mysql.com/downloads/file/?id=527192 [root@rocky8-45 ~]$wget 'https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz' ##下載安裝 [root@rocky8-45 ~]$yum -y install libaio numactl-libs ncurses-compat-libs [root@rocky8-45 ~]$groupadd mysql [root@rocky8-45 ~]$useradd -r -g mysql -s /bin/false mysql [root@rocky8-45 ~]$tar xvf mysql-8.4.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local [root@rocky8-45 local]$ln -s /usr/local/mysql-8.4.0-linux-glibc2.28-x86_64/ mysql [root@rocky8-45 local]$chown -R mysql.mysql mysql [root@rocky8-45 local]$chown -R mysql.mysql mysql-8.4.0-linux-glibc2.28-x86_64/ ##修改環境變數及配置 [root@rocky8-45 ~]$echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh [root@rocky8-45 ~]$. /etc/profile.d/mysql.sh [root@rocky8-45 ~]$cat /etc/my.cnf [mysqld] datadir=/data/mysql skip_name_resolve=1 socket=/data/mysql/mysql.sock log-error=/data/mysql/mysql.log pid-file=/data/mysql/mysql.pid [client] socket=/data/mysql/mysql.sock [root@rocky8-45 ~]$mkdir /data/mysql -pv mkdir: created directory '/data' mkdir: created directory '/data/mysql' [root@rocky8-45 ~]$chown -R mysql.mysql /data/mysql/ ##初始化並生成root空密碼,可以登入 [root@rocky8-45 ~]$mysqld --initialize-insecure --user=mysql --datadir=/data/mysql [root@rocky8-45 ~]$cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [root@rocky8-45 ~]$chkconfig --add mysqld [root@rocky8-45 ~]$systemctl start mysql [root@rocky8-45 ~]$mysql ##修改密碼後再次驗證登入 [root@rocky8-45 ~]$mysqladmin -uroot password '123456' [root@rocky8-45 ~]$mysql -uroot -p123456 ##安全加固,設定root口令以及口令複雜度,禁止root遠端,刪除anonymous、刪除test,立刻生效 [root@rocky8-45 ~]$mysql_secure_installation ##修改預設字符集及排序,增加內容後重啟服務 ##配置檔案mysqld為伺服器端,client為所有客戶端工具(有時候某些工具報錯,可能就是設定了client的內容),mysql僅為客戶端工具 [root@rocky8-45 ~]$cat /etc/my.cnf [mysqld] character-set-server=utf8mb4 [mysql] default-character-set=utf8mb4 [client] default-character-set=utf8mb4 [root@rocky8-45 ~]$systemctl restart mysqld.service |
#
- 掌握如何獲取SQL命令的幫助,基於幫助完成新增testdb庫,字符集utf8, 排序集合utf8_bin.建立host表,欄位(id,host,ip,cname等)
##幫助 mysql> \h mysql> help contents mysql> help create database; mysql> CREATE DATABASE testdb CHARACTER SET = utf8 COLLATE =utf8_bin ; mysql> use testdb; mysql> CREATE TABLE host ( -> id tinyint(3) unsigned NOT NULL AUTO_INCREMENT, -> host char(50) DEFAULT NULL, -> ip int(10) unsigned DEFAULT NULL, -> cname varchar(50) DEFAULT NULL, -> PRIMARY KEY (id) -> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; mysql> insert host(host,ip,cname)values('wang',10002,'wang'); |
- 根據表擴充套件出幾個語句,完成總結DDL, DML的用法,並配上示例。
DDL:create、alter(rename、add、modify、change、drop...)、drop DDL屬於修改表結構、屬性等非資料資訊; DML:insert、update、delete DML屬於改變資料資訊; DQL:distinct、group by、order by、limit 查詢語句 mysql> alter table host modify ip varchar(20); mysql> insert host(host,ip,cname) values('mage',"10.0.0.3",'MAGE'); |
- 總結mysql架構原理
- 總結myisam和Innodb儲存引擎的區別。
InnoDB引擎特點(目前預設資料庫引擎)
行級鎖
支援事務,適合處理大量短期事務 (保持資料完整性)
讀寫阻塞與事務隔離級別相關
可快取資料和索引
支援聚簇索引
崩潰恢復性更好
支援MVCC高併發 (多個版本並存,有兩個欄位插入時間點、刪除時間點,實現多個版本並存)
myisam:不支援事務(可能導致資料不一致)、表級鎖定,不適用頻繁讀寫場景;
- 總結mysql索引作用,同時總結哪些查詢不會使用到索引。
索引index目的:是排序的快速查詢的特殊資料結構,索引透過儲存引擎實現。
某些索引型別會導致修改索引列(修改索引列或新增資料),需要改後面的索引(重新生成索引路徑),因此讀的多、寫的少的表,使用索引效果更好;
索引採用左字首索引,所以用where**=x%可以使用到索引快速查詢,但用where**=%x|%x%則無法使用索引。
- 總結事務ACID事務特性
事務從begin到commit(或rollback)作為一個整體修改,外界根據隔離級別檢視到事務內部資料(DML)的變動。
mysql預設可重複讀的隔離級別,則讀到事務開始前或提交後的資料。
- 總結事務日誌工作原理。
目的:保證一個整體的執行;
方法:將dml指令碼儲存,redo,備份操作(當系統故障時,能重新執行);undo,回滾操作(當報錯時,能回滾,相當於整體不做變動)。
事務日誌效能最佳化innodb_flush_log_at_trx_commit=0|1|2:
0:提交事務後,寫入到log buffer,每秒寫入到記憶體,寫入到磁碟;
1:提交事務後,寫入到log buffer,寫入到記憶體,寫入到磁碟;預設值;
2:提交食物後,寫入到log buffer,寫入到記憶體,每秒寫入到磁碟;
1穩定(持續有磁碟IO,最慢但資料不丟失),2高併發更佳(會有1秒資料丟失的風險)
- 總結mysql日誌型別,並說明如何啟動日誌。
事務日誌 | innodb_log_file_size 50331648 #每個日誌檔案大小 innodb_log_buffer_size 事務日誌緩衝區大小 innodb_log_files_in_group 2 #日誌組成員個數 innodb_log_group_home_dir ./ #事務檔案路徑 使用begin,或start transaction 開始,commit,或rollback 結束 |
錯誤日誌 | 記錄級別: System event:0 Error event:1 Warning event:2 Note/information event:3 級別: MariaDB [hellodb]> SHOW GLOBAL VARIABLES LIKE 'log_warnings' ; mysql> SHOW GLOBAL VARIABLES LIKE 'log_error_verbosity' ; 日誌路徑: mysql> SHOW GLOBAL VARIABLES LIKE 'log_error'; |
通用日誌 | 可統計指令碼關鍵字,考慮建立搜尋多的內容建立索引; general_log=ON|OFF general_log_file=HOSTNAME.log log_output=TABLE|FILE|NONE 日誌路徑: mysql> select @@general_log_file; |
慢查詢日誌 | 記錄執行查詢時長超出指定時長的操作 slow_query_log=ON|OFF #開啟或關閉慢查詢,支援全域性和會話,只有全域性設定才會生成慢查詢檔案 long_query_time=N #慢查詢的閥值,單位秒 ,預設為10s slow_query_log_file=HOSTNAME-slow.log #慢查詢日誌檔案 |
二進位制日誌 (備份還原使用row) | 記錄已提交的日誌(事務日誌記錄操作和已提交) statement,記錄語句;row,記錄資料,日誌量大,能作為資料還原;mixed,混合型別; ##開啟 set sql_log_bin=1; ##修改伺服器選項,設定目錄以及檔案字首mysql-bin [root@rocky8-42 ~]$cat /etc/my.cnf [mysqld] binlog_format=row log_bin=/data/mysql/logbin/mysql-bin ##檢視日誌檔案 mysqlbinlog /data/mysql/logbin/mysql-bin.000005 -v ##可使用二進位制檔案生成sql指令碼,就能實現指令碼還原 mysqlbinlog backup/mariadb-bin.000003 > /backup/inc.sql |
- 總結二進位制日誌的不同格式的使用場景。
binlog_format,二進位制格式
statement:記錄語句,如使用update>=或者now()時間插入欄位,則沒有備份意義;
row:逐行,檢視日誌可知,逐條語句逐條改動,保證資料完全一樣,但日誌量巨大,備份就選擇row;
mixed:系統自行判斷;
- 總結mysql備份型別,並基於mysqldump, xtrabackup完成資料庫備份與恢復驗證。
備份型別:完全備份、增量備份、差異備份;冷備(停服務,可用於複製資料目錄),溫備(可讀不可寫,比較合適mysqldump+binlog),熱備(可讀可寫);
二進位制檔案不應該與資料檔案放在同一磁碟;
範例:mysqldump全量+binlog增量還原
##原資料庫43,安裝修改二進位制目錄 [root@rocky8-43 ~]$yum -y install mysql-server [root@rocky8-43 ~]$cat /etc/my.cnf [mysqld] log-bin=/data/mysql/mysql-bin [root@rocky8-43 ~]$mkdir /data/mysql -p [root@rocky8-43 ~]$chown -R mysql.mysql /data/mysql/ [root@rocky8-43 ~]$systemctl enable --now mysqld ##確認寫入資料,全量備份生成sql、以及新的二進位制日誌 [root@rocky8-43 ~]$mysql < hellodb_innodb.sql [root@rocky8-43 ~]$mysql -e 'show databases;' [root@rocky8-43 ~]$mysqldump -A -F --single-transaction --source-data=2 > full.sql ##修改資料,將修改的二進位制日誌生成sql mysql> use hellodb; mysql> update teachers set name='wang' where tid=1; [root@rocky8-43 ~]$mysqlbinlog /data/mysql/mysql-bin.000003 > update_teachers.sql ##傳送備份指令碼 [root@rocky8-43 ~]$scp full.sql update_teachers.sql 10.0.0.44: ##目標資料庫44,執行指令碼後驗證 [root@rocky8-44 ~]$mysql < full.sql [root@rocky8-44 ~]$mysql < update_teachers.sql mysql> select * from teachers; | 1 | wang | 45 | M | |
15. 編寫crontab,每天按表備份所有mysql資料。將備份資料放在以天為時間的目錄下。基於xtrabackup,每週1,周5進行完全備份,周2到周4進行增量備份 xtrabackup這個先放一放。。。