MySQL 的 Binlog 記錄著 MySQL 數據庫的所有變更信息,了解 Binlog 的結構可以幫助我們解析Binlog,甚至對 Binlog 進行一些修改,或者說是“篡改”,例如實現類似于 Oracle 的 flashback 的功能,恢復誤刪除的記錄,把 update 的記錄再還原回去等。本文將帶您探討一下這些神奇功能的實現,您會發現比您想象地要簡單得多。本文指的 Binlog 是 ROW 模式的 Binlog,這也是 MySQL 8 里的默認模式,STATEMENT 模式因為使用中有很多限制,現在用得越來越少了。
成都創新互聯成立與2013年,是專業互聯網技術服務公司,擁有項目成都網站設計、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元奈曼做網站,已為上家服務,為奈曼各地企業和個人服務,聯系電話:13518219792
Binlog 由事件(event)組成,請注意是事件(event)不是事務(transaction),一個事務可以包含多個事件。事件描述對數據庫的修改內容。
現在我們已經了解了 Binlog 的結構,我們可以試著修改 Binlog 里的數據。例如前面舉例的 Binlog 刪除了一條記錄,我們可以試著把這條記錄恢復,Binlog 里面有個刪除行(DELETE_ROWS_EVENT)的事件,就是這個事件刪除了記錄,這個事件和寫行(WRITE_ROWS_EVENT)的事件的數據結構是完全一樣的,只是刪除行事件的類型是 32,寫行事件的類型是 30,我們把對應的 Binlog 位置的 32 改成 30 即可把已經刪除的記錄再插入回去。從前面的 “show binlog events” 里面可看到這個 DELETE_ROWS_EVENT 是從位置 378 開始的,這里的位置就是 Binlog 文件的實際位置(以字節為單位)。從事件(event)的結構里面可以看到 type_code 是在 event 的第 5 個字節,我們寫個 Python 小程序把把第383(378+5=383)字節改成 30 即可。當然您也可以用二進制編輯工具來改。
找出 Binlog 中的大事務
由于 ROW 模式的 Binlog 是每一個變更都記錄一條日志,因此一個簡單的 SQL,在 Binlog 里可能會產生一個巨無霸的事務,例如一個不帶 where 的 update 或 delete 語句,修改了全表里面的所有記錄,每條記錄都在 Binlog 里面記錄一次,結果是一個巨大的事務記錄。這樣的大事務經常是產生麻煩的根源。我的一個客戶有一次向我抱怨,一個 Binlog 前滾,滾了兩天也沒有動靜,我把那個 Binlog 解析了一下,發現里面有個事務產生了 1.4G 的記錄,修改了 66 萬條記錄!下面是一個簡單的找出 Binlog 中大事務的 Python 小程序,我們知道用 mysqlbinlog 解析的 Binlog,每個事務都是以 BEGIN 開頭,以 COMMIT 結束。我們找出 BENGIN 前面的 “# at” 的位置,檢查 COMMIT 后面的 “# at” 位置,這兩個位置相減即可計算出這個事務的大小,下面是這個 Python 程序的例子。
切割 Binlog 中的大事務
對于大的事務,MySQL 會把它分解成多個事件(注意一個是事務 TRANSACTION,另一個是事件 EVENT),事件的大小由參數 binlog-row-event-max-size 決定,這個參數默認是 8K。因此我們可以把若干個事件切割成一個單獨的略小的事務
ROW 模式下,即使我們只更新了一條記錄的其中某個字段,也會記錄每個字段變更前后的值,這個行為是 binlog_row_image 參數控制的,這個參數有 3 個值,默認為 FULL,也就是記錄列的所有修改,即使字段沒有發生變更也會記錄。這樣我們就可以實現類似 Oracle 的 flashback 的功能,我個人估計 MySQL 未來的版本從可能會基于 Binlog 推出這樣的功能。
了解了 Binlog 的結構,再加上 Python 這把瑞士軍刀,我們還可以實現很多功能,例如我們可以統計哪個表被修改地最多?我們還可以把 Binlog 切割成一段一段的,然后再重組,可以靈活地進行 MySQL 數據庫的修改和遷移等工作。
一、未使用的數據庫 改名方法如下:1、未使用的數據庫改名比較方便,找到你要更改的數據庫,右鍵選擇【重命名】。2、然后將你想要更改的名字寫好,然后點擊一下旁邊的空白欄。3、然后你就發現數據庫的名稱已經改好了。二、使用中的數據庫改名方法如下:1、使用中的數據庫你在使用這種方法顯然是不合適,你用這種方法更改數據庫的名字之后會提示你無法重命名數據庫。2、這時還是同樣的右鍵你要改名的數據庫,選擇【屬性】按鈕。3、然后在數據庫屬性左側菜單欄中選擇【選項】按鈕。4、然后在【狀態】欄目下有一項限制訪問選項,默認的是MULTI_USER,意為多用戶模式,然后你將其更改為【SINGLE_USER】單用戶模式,點擊確定即可。5、然后你在使用上面的方法更改數據庫的名稱會發現數據庫改名成功了。
方法如下:
1、打開mysql.exe和mysqld.exe所在的文件夾,復制路徑地址
2、打開cmd命令提示符,進入上一步mysql.exe所在的文件夾。
3、輸入命令 ?mysqld --skip-grant-tables ?回車,此時就跳過了mysql的用戶驗證。注意輸入此命令之后命令行就無法操作了,此時可以再打開一個新的命令行。注意:在輸入此命令之前先在任務管理器中結束mysqld.exe進程,確保mysql服務器端已結束運行。
4、然后直接輸入mysql,不需要帶任何登錄參數直接回車就可以登陸上數據庫。
5、輸入show databases; ? 可以看到所有數據庫說明成功登陸。
6、其中mysql庫就是保存用戶名的地方。輸入 use mysql; ? 選擇mysql數據庫。
7、show tables查看所有表,會發現有個user表,這里存放的就是用戶名,密碼,權限等等賬戶信息。
8、輸入select user,host,password from user; ? 來查看賬戶信息。
9、更改root密碼,輸入update user set password=password('123456') where user='root' and host='localhost';
10、再次查看賬戶信息,select user,host,password from user; ? 可以看到密碼已被修改。
11、退出命令行,重啟mysql數據庫,用新密碼嘗試登錄。
12、測試不帶密碼登錄mysql,發現還是能夠登陸上,但顯示數據庫時只能看到兩個數據庫了,說明重啟之后跳過密碼驗證已經被取消了。
13、重啟數據庫之后之所以不帶密碼任然能夠登錄是因為數據庫里存在設無須口令的賬戶。
擴展資料:
MySQL是一種開放源代碼的關系型數據庫管理系統(RDBMS),使用最常用的數據庫管理語言--結構化查詢語言(SQL)進行數據庫管理。
MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載并根據個性化的需要對其進行修改。
MySQL因為其速度、可靠性和適應性而備受關注。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。
1:使用SHOW語句找出在服務器上當前存在的數據庫:
mysql SHOW DATABASES;
2:創建一個數據庫MYSQLDATA
mysql CREATE DATABASE MYSQLDATA;
3:選擇你所創建的數據庫
mysql USE MYSQLDATA; (按回車鍵出現Database changed 時說明操作成功!)
4:查看現在的數據庫中存在什么表
mysql SHOW TABLES;
5:創建一個數據庫表
mysql CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));
6:顯示表的結構:
mysql DESCRIBE MYTABLE;
7:往表中加入記錄
mysql insert into MYTABLE values (”hyq”,”M”);
8:用文本方式將數據裝入數據庫表中(例如D:/mysql.txt)
mysql LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE MYTABLE;
9:導入.sql文件命令(例如D:/mysql.sql)
mysqluse database;
mysqlsource d:/mysql.sql;
10:刪除表
mysqldrop TABLE MYTABLE;
11:清空表
mysqldelete from MYTABLE;
12:更新表中數據
mysqlupdate MYTABLE set sex=”f” where name=’hyq’;
參考資料來源:百度百科:MySQL數據庫
1、方法一:重命名所有的表,代碼如下:
CREATE
DATABASE
new_db_name;
RENAME
TABLE
db_name.table1
TO
new_db_name.table1,
db_name.table2
TO
new_db_name.table2;
DROP
DATABASE
db_name;
2、方法二:mysqldump導出數據再導入,代碼如下:
mysqldump
-uxxxx
-pxxxx
-h
xxxx
db_name
db_name_dump.SQL
mysql
-uxxxx
-pxxxx
-h
xxxx
-e
“CREATE
DATABASE
new_db_name”
mysql
-uxxxx
-pxxxx
-h
xxxx
new_db_name
db_name_dump.SQL
mysql
-uxxxx
-pxxxx
-h
xxxx
-e
“DROP
DATABASE
db_name”
3、方法三:使用shell腳本重命名所有的表,代碼如下:
#!/bin/bash
mysqlconn=”mysql
-u
xxxx
-pxxxx
-S
/var/lib/mysql/mysql.sock
-h
localhost”
olddb=”db_name”
newdb=”new_db_name”
#$mysqlconn
-e
“CREATE
DATABASE
$newdb”
params=$($mysqlconn
-N
-e
“SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
WHERE
table_schema='$olddb'”)
for
name
in
$params;
do
$mysqlconn
-e
“RENAME
TABLE
$olddb.$name
to
$newdb.$name”;
done;
#$mysqlconn
-e
“DROP
DATABASE
$olddb”