十、資料庫升級、InnoDB的事務介紹、redo、undo介紹、MySQL日誌
阿新 • • 發佈:2020-11-02
一、資料庫升級
#1.提出方案
1)升級的方法
2)升級的步驟
3)升級的時間
4)升級步驟可能會出現的問題
5)出現的問題怎麼解決,解決時間
6)升級後出現的問題
#2.搭建新的資料庫
#3.備份就資料庫資料(如果需要修改儲存引擎,才會備份除了系統庫的所有庫,正常情況就是全部備份)
mysqldump -uroot -p -A -R --triggers --single-transaction --master-data=2 > /tmp/full.sql
#4.將備份的資料庫推送大哦新的資料庫
scp rsync 硬體 NFS
#5.匯入資料
mysql -uroot -p < /tmp/full.sql
#6.測試資料可用性
測試環境或開發環境打一個專案,測試
#7.修改程式程式碼,將資料庫資訊修改為新的資料庫地址
base.xml db_host: db_user: db_password:
#8.重新上線
二、InnoDB的事務介紹
1.事務週期
1)成功的事務
begin;
sql1;
sql2;
... ...
commit;
2)失敗的事務
begin;
sql1;
sql2;
... ...
rollback;
2.事務的特性(ACID)
Atomic(原子性)
所有語句作為一個單元全部成功執行或全部取消。
Consistent(一致性)
如果資料庫在事務開始時處於一致狀態,則在執行該事務期間將保留一致狀態。
Isolated(隔離性)
事務之間不相互影響。
Durable(永續性)
事務成功完成後,所做的所有更改都會準確地記錄在資料庫中。所做的更改不會丟失。
3.事務的控制語句
begin; #開啟一個事務
commit; #提交一個事務
rollback; #回滾一個事務
autocommit #自動提交
三、事務的日誌
1.redo log
redo:"重做",記錄的是,記憶體資料頁的變化過程
1)作用
在事務ACID過程中,實現的是 "D" 持久化的作用。
2)工作原理
#1.修改資料時:
1)首先資料會從磁碟取出,載入到記憶體的data buffer page
2)操作資料,使用update語句修改資料,資料 2 變成 1
3)id=2變成id=1的變化過程會記錄到redo buffer page中
4)當執行commit後,mysql會將redo buffer page中的變化過程寫入磁碟的redo log中
#2.查詢時:
1)執行select查詢語句
2)資料 id=2 會從磁碟載入到data buffer page
3)並且將redo log中id=2變成id=1的變化過程取出到記憶體的redo buffer page中
4)通過data buffer page的資料和redo buffer page的變化過程,得到結果 id=1
2.undo log工作原理
3.CSR工作原理,基於redo、undo模型
四、事務中的鎖
1.什麼是鎖
1.鎖 顧名思義就是鎖定的意思
2.作用:在事務ACID特性過程中,“鎖”和“隔離級別”一起來實現“I”隔離性的作用
2.鎖的類別
排他鎖:在修改一條資料是,其他人不得修改
共享鎖:保證在多事務工作期間,資料查詢時不會被阻塞
樂觀鎖:多事務操作時,資料可以被同時修改,誰先提交,誰修改成功
悲觀鎖:多事務操作時,資料只有一個人可以修改
3.多版本併發控制
1.只阻塞修改類操作(排他鎖),不阻塞查詢類操作(共享鎖)
2.樂觀鎖的機制(誰先提交誰為準)
4.鎖的粒度
MyISAM:表級鎖
InnoDB:行級鎖
5.事務的隔離級別
1)四種隔離級別
1.RU級別:READ UNCOMMITTED(未提交讀),允許事務檢視其他事務所進行的未提交更改
2.RC級別:READ COMMITTED,允許事務檢視其他事務所進行的已提交更改
3.RR級別:REPEATABLE READ,允許事務檢視其他事務所進行的已提交更改,需要重新登入資料庫才能檢視到提交的資料
4.序列化:SERIALIZABLE,將一個事務的結果與其他事務完全隔離
2)資料庫專業名詞
#1.髒讀:
執行一個事務,還沒有提交就被讀取,可是事務回滾了,那麼之前讀到的資料就是髒資料
#2.幻讀:
當刪除一條資料時,剛刪除,有別人插入同一條資料,我檢視時以為是沒有刪除
#3.不可重複讀
第一次讀取資料和第二次讀取資料之間資料被別人修改了,導致第一次讀取的資料與第二次讀取的資料不同
3)設定隔離級別
#1.檢視隔離級別
mysql> show variables like '%iso%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
#2.設定資料庫為RU級別
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
transaction_isolation=read-uncommit
#transaction_isolation=read-commit
五、MySQL日誌
1.錯誤日誌
1.預設錯誤日誌是開啟
2.預設的路徑是MySQL的資料目錄 $datadir
3.預設的名字是 '主機名'.err
4.檢視錯誤日誌
mysql> show variables like 'log_error';
[root@db01 ~]# mysql -uroot -p123 -e "show variables like 'log_error'"
5.配置錯誤日誌
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
log_error=/usr/local/mysql/data/mysql.err
#log_error=mysql.err
#常用的資料庫配置
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
port=3306
socket=/tmp/mysql.sock
server_id=1
character-set-server=utf8
innodb_data_file_path=ibdata1:76M;ibdata2:12M:autoextend
log_error=/usr/local/mysql/data/mysql.err
[mysql]
socket=/tmp/mysql.sock
2.一般查詢日誌
1.預設一般查詢日誌是關閉的
2.如果開啟預設的路徑是MySQL的資料目錄 $datadir
3.預設的名字是 '主機名'.log
4.檢視一般查詢日誌
mysql> show variables like "general_log%";
[root@db01 ~]# mysql -uroot -p123 -e "show variables like 'general_log%'"
5.配置錯誤日誌
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
general_log=on
general_log_file=/usr/local/mysql/data/db01.log
#一般情況我們不會開啟一般查詢日誌,因為所有的操作都會被記錄,第一不安全,第二會浪費磁碟空間
3.二進位制日誌
1.預設二進位制日誌是關閉的
2.如果開啟預設的路徑是MySQL的資料目錄 $datadir
3.一般指定的的名字是 mysql-bin.000001
4.檢視二進位制日誌
mysql> show variables like 'log_bin';
[root@db01 ~]# mysql -uroot -p123 -e "show variables like 'log_bin'"
5.配置二進位制日誌
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1 #在MySQL5.7中,必須配置server_id
log_bin=mysql-bin #在MySQL5.6版本,直接配置就開啟了
1)作用
1.記錄已提交的DML事務語句,並拆分為多個事件(event)來進行記錄
2.記錄所有DDL、DCL等語句,總之,二進位制日誌會記錄所有對資料庫發生修改的操作
3.可以用恢復資料
2)事件
1.在binlog中最小的記錄單元為event
2.一個事務會被拆分成多個事件(event)
#事件(event)特性:
1.每個event都有一個開始位置(start position)和結束位置(stop position)。
2.所謂的位置就是event對整個二進位制的檔案的相對位置。
3.對於一個二進位制日誌中,前120個position是檔案格式資訊預留空間。
4.MySQL第一個記錄的事件,都是從120開始的