MySQL數(shù)據(jù)庫(kù)基礎(chǔ)(四)grant授權(quán)、binlog日志介紹

目錄
一、用戶授權(quán)
1.1 grant授權(quán)
1.2 相關(guān)命令授權(quán)庫(kù)
1.3 revoke撤銷(xiāo)權(quán)限
二、root密碼
2.1 恢復(fù)root密碼(忘記密碼)
2.2 重置root密碼
三、MySQL備份
3.1 備份概述物理、邏輯備份
3.2 數(shù)據(jù)備份策略完全備份、增量備份
四、增量備份 binlog日志
4.1 binlog日志概述
4.2 啟用日志
4.3 分析日志
4.4 恢復(fù)數(shù)據(jù)

一、用戶授權(quán)
1.1 grant授權(quán)

  • grant授權(quán)︰添加用戶并設(shè)置權(quán)限 命令格式

grant 權(quán)限列表 on 庫(kù)名 to 用戶名@”客戶端地址” identified by “密碼” //授權(quán)用戶密碼
with grant option; //有授權(quán)權(quán)限,可選項(xiàng)

mysql>grant all on db4.*to yaya@"%" identified by "123qqq..A”;
  • 權(quán)限列表
    all //所有權(quán)限
    usage //無(wú)權(quán)限
    select,update,insert //I個(gè)別權(quán)限
    select,update (字段1,.. ..,字段N) //指定字段
    用戶詳情的權(quán)限列表請(qǐng)參考MySQL官網(wǎng)說(shuō)明:https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html

  • 庫(kù)名
    *.* //所有庫(kù)所有表
    庫(kù)名.* //一個(gè)庫(kù)
    庫(kù)名.表名 //一張表

  • 用戶名
    授權(quán)時(shí)自定義要有標(biāo)識(shí)性
    存儲(chǔ)在mysql庫(kù)的user表里

  • 客戶端地址
    % //所有主機(jī)
    192.168.4.% //網(wǎng)段內(nèi)的所有主機(jī)
    192.168.4.1 //1臺(tái)主機(jī)
    localhost //數(shù)據(jù)庫(kù)服務(wù)器本機(jī)

應(yīng)用示例
添加用戶mydba,對(duì)所有庫(kù)、表有完全權(quán)限
允許從任何客戶端連接,密碼abc123
且有授權(quán)權(quán)限

mysql> grant all on *.*  to  mydba@'%'  identified  by  "abc123"  with grant  option;
Query OK, 0 rows affected, 1 warning (0.02 sec)

需要注意的是 8.0之后的新版的的mysql版本已經(jīng)將創(chuàng)建賬戶和賦予權(quán)限的方式分開(kāi)了
之前創(chuàng)建方式會(huì)報(bào)錯(cuò):

mysql> grant all on *.* to mydba@"%" identified by "abc123" with grant option;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by "123qqq...A" with grant option' at line 1

8.0 版本后 grant授權(quán) 創(chuàng)建賬戶和賦予權(quán)限的需要分兩步完成
1.創(chuàng)建賬戶:create user '用戶名'@'訪問(wèn)主機(jī)' identified by '密碼';
2.賦予權(quán)限:grant 權(quán)限列表 on 數(shù)據(jù)庫(kù) to '用戶名'@'訪問(wèn)主機(jī)' ;(修改權(quán)限時(shí)在后面加with grant option)
添加用戶mydba@"%"

mysql> create user mydba@"%" identified by "abc123";
Query OK, 0 rows affected (0.11 sec)

mysql> grant all on *.* to mydba@"%" with grant option;
Query OK, 0 rows affected (0.06 sec)

應(yīng)用示例
添加admin用戶,允許從192.168.4.0/24網(wǎng)段連接,對(duì)db3庫(kù)的user表有查詢權(quán)限,密碼123qqq.….A
添加admin2用戶,允許從本機(jī)連接,允許對(duì)db3庫(kù)的所有表有查詢/更新/插入/刪除記錄權(quán)限,密123qqq....A

mysql> grant select on db3.user to  admin@"192.168.4.%"  identified  by  "123qqq...A";
mysql> grant select,insert,update,delete  on  db3.*  to  admin2@"localhost"   identified  by  "123qqq.….A";

1.2 相關(guān)命令授權(quán)庫(kù)


  • 授權(quán)庫(kù) mysql
  • mysql 庫(kù)記錄授權(quán)信息,主要表如下:
    user 表記錄已有的授權(quán)用戶及權(quán)限
    db 表記錄已有授權(quán)用戶對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)權(quán)限
    tables_priv 表記錄已有授權(quán)用戶對(duì)表的訪問(wèn)權(quán)限
    columns_priv 表記錄已有授權(quán)用戶對(duì)字段的訪問(wèn)權(quán)限

查看表記錄可以獲取用戶權(quán)限;也可以通過(guò)更新記錄,修改用戶權(quán)限

1.3 revoke撤銷(xiāo)權(quán)限

  • 命令格式
    mysql> revoke 權(quán)限列表 on 庫(kù)名.表 from 用戶名@"客戶端地址";
    mysql> revoke insert,drop on test.* FROM sqlero2@'localhost';
    Query OK,0 rows affected (0.00 sec)

案例1:用戶授權(quán)
1.允許192.168.4.0/24網(wǎng)段主機(jī)使用root連接數(shù)據(jù)庫(kù)服務(wù)器,對(duì)所有庫(kù)和所有表有完全權(quán)限、密碼為 abc123...A
2.添加用戶dba001,對(duì)所有庫(kù)和所有表有完全權(quán)限、且有授權(quán)權(quán)限,密碼為abc123...A 客戶端為網(wǎng)絡(luò)中的所有主機(jī)。
3.撤銷(xiāo)root從本機(jī)訪問(wèn)權(quán)限,然后恢復(fù)。
4.允許任意主機(jī)使用webuser用戶連接數(shù)據(jù)庫(kù)服務(wù)器,僅對(duì)webdb庫(kù)有完全權(quán)限,密碼為abc123...A.撤銷(xiāo)webuser的權(quán)限,使其僅有查詢記錄權(quán)限。

1)允許192.168.4.0/24網(wǎng)段主機(jī)使用root連接數(shù)據(jù)庫(kù)服務(wù)器,對(duì)所有庫(kù)和所有表有完全權(quán)限、密碼為 abc123...A
192.168.4.100遠(yuǎn)程登陸MySQL

[root@case100 ~]# mysql -u root -p -h 192.168.4.151
Enter password:     \\輸入密碼  登陸報(bào)錯(cuò)
ERROR 1045 (28000): Access denied for user 'root'@'192.168.4.100' (using password: YES)

添加192.168.4.0/24訪問(wèn)權(quán)限

[root@mysql ~]# mysql -uroot -p"123456"

mysql> grant all on *.* to root@'192.168.4.%' identified by "abc123...A";
Query OK, 0 rows affected, 1 warning (0.00 sec)

再次從192.168.4.0/24網(wǎng)段的客戶機(jī)訪問(wèn)時(shí),輸入正確的密碼后可登入

[root@case100 ~]# mysql -u root -p -h 192.168.4.151
Enter password: 
mysql> select host,user from mysql.user ;       \\登陸成功
+-------------+-----------+
| host        | user      |
+-------------+-----------+
| %           | mydba     |
| 192.168.4.% | root      |
| localhost   | mysql.sys |
| localhost   | root      |
+-------------+-----------+
4 rows in set (0.01 sec)
mysql> create database rootdb;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| rootdb             |      //新建的rootdb庫(kù)
| sys                |
+--------------------+
5 rows in set (0.01 sec)

2)添加用戶dba001,對(duì)所有庫(kù)和所有表有完全權(quán)限、且有授權(quán)權(quán)限,密碼為abc123...A 客戶端為網(wǎng)絡(luò)中的所有主機(jī)。

mysql> grant all on *.*   to  dba001@"%"  identified by "abc123...A"  with grant option;        //添加用戶并授權(quán)
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show grants for dba001@"%";           //查看dba001權(quán)限
+---------------------------------------------------------------+
| Grants for dba001@%                                           |
+---------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'dba001'@'%' WITH GRANT OPTION |
+---------------------------------------------------------------+
1 row in set (0.00 sec)

3)撤銷(xiāo)root從本機(jī)訪問(wèn)權(quán)限,然后恢復(fù)。
注意:如果沒(méi)有事先建立其他管理賬號(hào),請(qǐng)不要輕易撤銷(xiāo)root用戶的本地訪問(wèn)權(quán)限,否則恢復(fù)起來(lái)會(huì)比較困難,甚至不得不重裝數(shù)據(jù)庫(kù)。

mysql> revoke all on *.* from root@"localhost";     //撤銷(xiāo)root@"localhost"所有權(quán)限
Query OK, 0 rows affected (0.01 sec)

mysql> show grants for root@localhost;          //查看root@localhost權(quán)限
+--------------------------------------------------------------+
| Grants for root@localhost                                    |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'root'@'localhost' WITH GRANT OPTION   |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+--------------------------------------------------------------+
2 rows in set (0.01 sec)

mysql> exit
Bye

[root@mysql ~]# mysql -uroot -p"123456"    //重裝登陸測(cè)試

mysql> drop database rootdb;       //失敗 報(bào)錯(cuò)
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'rootdb'

嘗試以當(dāng)前的root用戶恢復(fù)權(quán)限,也會(huì)失敗(無(wú)權(quán)更新授權(quán)表):

mysql> grant all on *.* to root@localhost  with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

mysql> exit
Bye

由管理賬號(hào)dba001重新為root添加本地訪問(wèn)權(quán)限

[root@mysql ~]# mysql -udba001 -p"abc123...A"

mysql> grant all on *.* to root@localhost  with grant option;
Query OK, 0 rows affected (0.01 sec)

mysql> exit
Bye

[root@mysql ~]# mysql -uroot -p"123456"    //root帳號(hào)重新登陸測(cè)試

mysql> drop database rootdb;    //權(quán)限恢復(fù) 刪除成功
Query OK, 0 rows affected (0.02 sec)

4)允許任意主機(jī)使用webuser用戶連接數(shù)據(jù)庫(kù)服務(wù)器,僅對(duì)webdb庫(kù)有完全權(quán)限,密碼為1abc123...A.撤銷(xiāo)webuser的權(quán)限,使其僅有查詢記錄權(quán)限。

mysql> create database webdb;               //新建庫(kù)webdb
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| webdb              |
+--------------------+
5 rows in set (0.01 sec)

mysql> grant all on webdb.* to webuser@'%' identified by "abc123...A";        //對(duì)用戶webuser授權(quán)
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> show grants for webuser@'%';
+----------------------------------------------------+
| Grants for webuser@%                               |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO 'webuser'@'%'                |
| GRANT ALL PRIVILEGES ON `webdb`.* TO 'webuser'@'%' |
+----------------------------------------------------+
2 rows in set (0.00 sec)

mysql> revoke all on webdb.* from webuser@'%';     //撤銷(xiāo)webuser@"%"所有權(quán)限
Query OK, 0 rows affected (0.02 sec)

mysql> show grants for webuser@'%';
+-------------------------------------+
| Grants for webuser@%                |
+-------------------------------------+
| GRANT USAGE ON *.* TO 'webuser'@'%' |
+-------------------------------------+
1 row in set (0.00 sec)

二、root密碼
2.1 恢復(fù)root密碼(忘記密碼)
root密碼忘了怎么辦?
1.停止MySQL服務(wù)程序
2.跳過(guò)授權(quán)表啟動(dòng)MySQL服務(wù)程序
3.修改root密碼
4.以正常方式重啟MySQL服務(wù)程序

主要操作過(guò)程

]# vim  /etc/my.cnf
[mysqld]
......
skip_grant_tables              //配置中追加跳過(guò)權(quán)限檢測(cè)
]# systemctl restart mysqld
]# mysql
mysql> update mysql.user set authentication_string=password(“密碼”)
->where user="root" and host="localhost";                              //修改密碼
mysql> flush privileges;                         //刷新立即生效,后面我們需要重啟數(shù)據(jù)庫(kù),這步其實(shí)可以省略
mysql> quit ;

2.2 重置root密碼
修改管理員root密碼有很多種方法以下介紹幾種常用的

1)方法1,在Shell命令行下設(shè)置

[root@mysql ~]# mysqladmin -uroot -p password 'abc321...A'
Enter password: 
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

2)方法2,以root登入mysql> 后,使用SET PASSWORD指令設(shè)置
這個(gè)與新安裝MySQL-server后首次修改密碼時(shí)要求的方式相同,平時(shí)也可以用:

mysql> SET PASSWORD FOR root@localhost=PASSWORD('1234567');
Query OK,0 rows affected,1warning(0.00 sec)

3)方法3,以root登入mysql> 后,使用GRANT授權(quán)工具設(shè)置,這個(gè)是最常見(jiàn)的用戶授權(quán)方式:

mysql> GRANT all ON *.* TO root@localhost IDENTIFIED BY '1234567';
Query OK,0 rows affected,1warning(0.00 sec)

4)方法4,以root登入mysql> 后,使用UPDATE更新相應(yīng)的表記錄
這種方法與恢復(fù)密碼時(shí)的操作相同:

mysql> UPDATE mysql.user SET authentication_string=PASSWORD('1234567') 
    -> WHERE user='root' AND host='localhost';        //重設(shè)root的密碼
Query OK,0 rows affected,1warning(0.00 sec)
Rows matched:1  Changed:0  Warnings:1
mysql> FLUSH PRIVILEGES;                  //刷新授權(quán)表
Query OK,0 rows affected(0.00 sec)

在上述方法中,需要特別注意:當(dāng)MySQL服務(wù)程序以 skip-grant-tables 選項(xiàng)啟動(dòng)時(shí),如果未執(zhí)行“FLUSH PRIVILEGES;”操作,是無(wú)法通過(guò)SET PASSWORD或者GRANT方式來(lái)設(shè)置密碼的。比如,驗(yàn)證這兩種方式時(shí),都會(huì)看到ERROR 1290的出錯(cuò)提示:

mysql> SET PASSWORD FOR root@localhost=PASSWORD('1234567');
ERROR 1290(HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> GRANT all ON *.* TO root@localhost IDENTIFIED BY '1234567';
ERROR 1290(HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement

案例2: root密碼
具體要求如下:
1.恢復(fù)管理員root密碼123qqq...A
2.重置管理員root密碼 A...qqq321

[root@mysql ~]# systemctl stop mysqld
[root@mysql ~]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 二 2020-12-22 17:38:12 CST; 6s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 21258 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 21240 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 21261 (code=exited, status=0/SUCCESS)

12月 22 11:45:03 mysql systemd[1]: Starting MySQL Server...
12月 22 11:45:04 mysql systemd[1]: Started MySQL Server.
12月 22 17:38:09 mysql systemd[1]: Stopping MySQL Server...
12月 22 17:38:12 mysql systemd[1]: Stopped MySQL Server.

[root@mysql ~]# vim /etc/my.cnf
skip_grant_tables
......

[root@mysql ~]# systemctl start mysqld
[root@mysql ~]# mysql 
mysql> update mysql.user set authentication_string=password('abc123...B') where user="root" and  host="localhost";
Query OK, 0 rows affected, 1 warning (0.02 sec)
Rows matched: 1  Changed: 0  Warnings: 1
mysql> flush privileges;                 
Query OK, 0 rows affected (0.01 sec)

mysql> exit

[root@mysql ~]# vim /etc/my.cnf
#skip_grant_tables
......
[root@mysql ~]# vim /etc/my.cnf
#skip_grant_tables              //刪除skip_grant_tables  重啟服務(wù)
......
[root@mysql ~]# systemctl restart mysqld
[root@mysql ~]# mysql -uroot  -p"abc123...B"

mysql> 

三、MySQL備份
3.1 備份概述物理、邏輯備份

  • 備份概述
    數(shù)據(jù)備份方式
    物理備份
    冷備:cp、tar、...

  • 邏輯備份
    mysqldump //備份命令
    mysql //恢復(fù)命令

  • 物理備份及恢復(fù)
    備份操作
    cp -r /var/lib/mysql 備份目錄/mysql.bak
    tar -zcvf /root/mysql.tar.gz /var/lib/mysql/*

  • 恢復(fù)操作
    cp -r 備份目錄/mysql.bak /var/lib/mysql/
    tar -zxvf /root/mysql.tar.gz -C /var/lib/mysq1/
    chown -R mysql:mysql /var/lib/mysql

  • 邏輯備份
    數(shù)據(jù)備份策略
    完全備份
    備份所有數(shù)據(jù)

  • 增量備份
    備份上次備份后,所有新產(chǎn)生的數(shù)據(jù)

  • 差異備份
    備份完全備份后,所有新產(chǎn)生的數(shù)據(jù)

  • 完全備份及恢復(fù)
    完全備份
    ]#mysqldump -uroot -p密碼庫(kù)名 > 目錄/xxx.sql
    完全恢復(fù)
    ]#mysql -uroot -p密碼[庫(kù)名] < 目錄/xxx.sql

  • 備份時(shí)庫(kù)名表示方式
    --all-databases 或 -A //所有庫(kù)
    數(shù)據(jù)庫(kù)名 //單個(gè)庫(kù)
    數(shù)據(jù)庫(kù)名表名 //單張表
    -B 數(shù)據(jù)庫(kù)1 數(shù)據(jù)庫(kù)2 //多個(gè)庫(kù)

注意事項(xiàng)
無(wú)論備份還是恢復(fù),都要驗(yàn)證用戶權(quán)限!!!

  • 完全備份及恢復(fù) 應(yīng)用示例1
    -將所有的庫(kù)備份為allbak.sql文件
    -將db3庫(kù)備份為db3.sql文件

[root@dbsvr1 ~]# mysqldump -uroot -p密碼 -A > allbak.sql
[root@dbsvr1 ~]# mysqldump -uroot -p密碼 db3 > db3.sql
[root@dbsvr1 ~]# ls -lh *.sql
-rw-r--r--.1 root root 595K 1月2 13:54 allbak.sql-rw-r--r--. 1 root root 4.1K 1月2 13:55 db3.sql

案例3:數(shù)據(jù)備份與恢復(fù)
具體要求如下∶
1.練習(xí)mysqldump命令的使用
2.使用mysql命令恢復(fù)刪除的數(shù)據(jù)

1)備份MySQL服務(wù)器上的所有庫(kù)
將所有的庫(kù)備份為mysql-all.sql文件

[root@mysql ~]# mysqldump -u root -p --all-databases >/root/alldb.sql       //備份所有庫(kù)
Enter password: 

[root@mysql ~]# file /root/alldb.sql                //確定備份文件類型
/root/alldb.sql: UTF-8 Unicode text, with very long lines

[root@mysql ~]# cat /root/alldb.sql|head -15           //查看備份文件alldb.sql的部分內(nèi)容:
-- MySQL dump 10.13  Distrib 8.0.22, for Linux (x86_64)
--
-- Host: localhost    Database: 
-- ------------------------------------------------------
-- Server version   8.0.22

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!50606 SET @OLD_INNODB_STATS_AUTO_RECALC=@@INNODB_STATS_AUTO_RECALC */;
/*!50606 SET GLOBAL INNODB_STATS_AUTO_RECALC=OFF */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
[root@mysql ~]# 

注意:若數(shù)據(jù)庫(kù)都使用MyISAM存儲(chǔ)引擎,可以采用冷備份的方式,直接復(fù)制對(duì)應(yīng)的
數(shù)據(jù)庫(kù)目錄即可;恢復(fù)時(shí)重新復(fù)制回來(lái)就行。

2)只備份指定的某一個(gè)庫(kù)

[root@mysql ~]# mysqldump -uroot -p db1 > db1.sql   //備份db1
Enter password: 

[root@mysql ~]# cat /root/db1.sql|head -15
-- MySQL dump 10.13  Distrib 8.0.22, for Linux (x86_64)
--
-- Host: localhost    Database: db1
-- ------------------------------------------------------
-- Server version   8.0.22

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

3)同時(shí)備份指定的多個(gè)庫(kù)

[root@mysql ~]# mysqldump -u root -p -B mysql db1 db2  >mysql.db1.db2.sql  //備份db1 db2
Enter password:

[root@mysql ~]# ll /root/mysql.db1.db2.sql 
-rw-r--r-- 1 root root 1130849 12月 23 15:18 /root/mysql.db1.db2.sql

4)使用mysql 命令恢復(fù)刪除的數(shù)據(jù)
以恢復(fù)db1庫(kù)為例,可參考下列操作把數(shù)據(jù)恢復(fù)到另一臺(tái)數(shù)據(jù)庫(kù)上,如果是在原數(shù)據(jù)庫(kù)操作通常不建議直接覆蓋舊庫(kù),而是采用建立新庫(kù)并導(dǎo)入邏輯備份的方式執(zhí)行恢復(fù),待新庫(kù)正常后即可廢棄或刪除舊庫(kù)

mysql> create databases db1bak;   
Query OK, 1 row affected (0.01 sec)
mysql> exit

[root@mysql ~]# mysql -u root -p db1bak < /root/db1.sql    //恢復(fù)所有庫(kù)到db1bak
Enter password: 
[root@mysql ~]# mysql -uroot -p"abc321...A"
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1bak             |
| mysql              |
| performance_schema |
| sys                |
| webdb              |
+--------------------+
6 rows in set (0.00 sec)

mysql> use db1bak
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;          //查看數(shù)據(jù)完整性
+------------------+
| Tables_in_db1bak |
+------------------+
| gz               |
| school           |
| t1               |
| t3               |
| t4               |
| t5               |
| t6               |
| t8               |
| tea4             |
| yg               |
+------------------+
10 rows in set (0.00 sec)

mysql> select * from t1;
+------+---------+
| name | homedir |
+------+---------+
| bob  | USA     |
+------+---------+
1 row in set (0.00 sec)

四、增量備份 binlog日志

  • 4.1 binlog日志概述
    -binlog日志也稱做二進(jìn)制日志
    -MySQL服務(wù)日志文件的一種
    -記錄除查詢之外的所有SQL命令
    -可用于數(shù)據(jù)備份和恢復(fù)
    -配置mysql主從同步的必要條件

啟用日志主要操作

[root@mysql ~]# vim /etc/my.cnf
[mysqld]
...
log_bin   //啟用binlog日志
server_id=100   //指定id值

[root@mysql ~]# systemctl restart mysqld

啟用日志

  • binlog相關(guān)文件
    主機(jī)名-bin.index \\索引文件
    主機(jī)名-bin.000001 \\第1個(gè)二進(jìn)制日志
    主機(jī)名-bin.000002 \\第2個(gè)二進(jìn)制日志

  • 手動(dòng)生成新的日志文件:
    方法1. ]# systemctl restart mysqld
    方法2. mysql> flush logs; 或 ]# mysql -uroot -p密碼 -e'flush log'
    方法3.mysqldump --flush-logs

  • 清理日志
    刪除指定編號(hào)之前的binlog日志文件
    Mysql> purge master logs to "binlog文件名"; \\刪除所有binlog日志,重建新日志
    Mysql> reset master;

案例4 : binlog日志
啟用binlog日志,具體要求如下:

  1. 啟用binlog日志,把日志文件存放到系統(tǒng)的/mylog目錄下,日志文件為db50
  2. 手動(dòng)創(chuàng)建3個(gè)新的日志文件
  3. 刪除編號(hào)3之前的日志文件
[root@mysql ~]# vim /etc/my.cnf
[mysqld]
......
log_bin=/mylog/db50
server_id=1

[root@mysql ~]# systemctl restart mysqld
[root@mysql ~]# ll /mylog/
總用量 8
-rw-r----- 1 mysql mysql 154 12月 23 16:49 db50.000001
-rw-r----- 1 mysql mysql  19 12月 23 16:49 db50.index

[root@mysql ~]# mysql -uroot -p"abc321...A"

mysql> flush logs;                   //每執(zhí)行一次都會(huì)生成新的日志文件
Query OK, 0 rows affected (0.08 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.02 sec)

mysql> flush logs;                  
Query OK, 0 rows affected (0.02 sec)

mysql> system ls /mylog/
db50.000001  db50.000002  db50.000003  db50.000004  db50.index

mysql> show master status;    //查看當(dāng)前使用的日志文件
+-------------+----------+--------------+------------------+-------------------+
| File        | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------+----------+--------------+------------------+-------------------+
| db50.000004 |      154 |              |                  |                   |
+-------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> purge master logs to "db50.000003";     //刪除db50.000003之前的日志文件
Query OK, 0 rows affected (0.05 sec)

mysql> system ls /mylog/
db50.000003  db50.000004  db50.index
mysql>  cat /mylog/db50.index           //查看日志索引
/mylog/db50.000003
/mylog/db50.000004

4.3 分析日志
查看日志當(dāng)前記錄格式

mysql> show variables like "binlog_format";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.03 sec)

  • 三種記錄方式:
    1.statement報(bào)表模式
    2.row行模式
    3.mixed混合模式
    以上3種模式具體差異可自行查找,推薦mixed混合模式結(jié)合了1,2的優(yōu)勢(shì)

  • 修改日志記錄格式操作
    [root@localhost ~]# vim /etc/my.cnf
    [mysqld]
    .. ..
    binlog_format=“名稱”
    [root@localhost ~]# systemctl restart mysqld

  • 查看日志內(nèi)容
    mysqlbinlog [選項(xiàng)] binlog 日志文件名
    選項(xiàng)
    用途
    --start-datetime="yyyy-mm-dd hh:mm:ss” 起始時(shí)間 從二進(jìn)制日志中讀取指定等于時(shí)間戳或者晚于本地計(jì)算機(jī)的時(shí)間
    --stop-datetime="yyyy-mm-dd hh:mm:ss"結(jié)束時(shí)間 從二進(jìn)制日志中讀取指定小于時(shí)間戳或者等于本地計(jì)算機(jī)的時(shí)間
    --start-position=數(shù)字 起始偏移量 從二進(jìn)制日志中讀取指定position 事件位置作為開(kāi)始。
    --stop-position=數(shù)字 結(jié)束偏移量 從二進(jìn)制日志中讀取指定position 事件位置作為事件截至

在使用binlog數(shù)據(jù)恢復(fù)時(shí),推薦使用事件位置來(lái)確定開(kāi)始與截至段 會(huì)更精確
時(shí)間的方式只精確到秒,如果一秒內(nèi)同時(shí)發(fā)生了添加和刪除操作恢復(fù)會(huì)失敗

4.4 恢復(fù)數(shù)據(jù)

  • 基本思路
    使用mysqlbinlog提取歷史SQL操作,通過(guò)管道交給mysql命令執(zhí)行
    ·命令格式
    mysqlbinlog 日志文件│mysql -uroot -p密碼
  • 應(yīng)用示例
    使用編號(hào)為1的日志文件恢復(fù)數(shù)據(jù)
    ]# cd /var/lib/mysql
    ]# mysqlbinlog mysql-bin.000001 | mysql -uroot -p123456

案例5:使用binlog日志恢復(fù)數(shù)據(jù)
利用binlog恢復(fù)庫(kù)表,要求如下∶
1.啟用binlog日志、并修改格式為mixed
2.創(chuàng)建db1庫(kù)和tb1表并插入3條記錄
3.刪除tb1表中剛插入的3條記錄
4.使用binlog日志恢復(fù)刪除的3條記錄

[root@mysql ~]# vim /etc/my.cnf
......
binlog_format="mixed"

[root@mysql ~]# systemctl restart mysqld
[root@mysql ~]# ll /var/lib/mysql/mysql-bin.*
-rw-r----- 1 mysql mysql 177 12月 23 16:30 /var/lib/mysql/mysql-bin.000001
-rw-r----- 1 mysql mysql 154 12月 23 17:09 /var/lib/mysql/mysql-bin.000002
-rw-r----- 1 mysql mysql  38 12月 23 17:09 /var/lib/mysql/mysql-bin.index

[root@mysql ~]# systemctl restart mysqld           //每次重啟服務(wù)都會(huì)生成新的日志文件
[root@mysql ~]# ls /var/lib/mysql/mysql-bin.*
/var/lib/mysql/mysql-bin.000001  /var/lib/mysql/mysql-bin.000003
/var/lib/mysql/mysql-bin.000002  /var/lib/mysql/mysql-bin.index

[root@mysql ~]# mysql -uroot -p"abc321...A"

mysql> create database db1;      //新建庫(kù)db1
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| db1bak             |
| mysql              |
| performance_schema |
| sys                |
| webdb              |
+--------------------+
7 rows in set (0.00 sec)

mysql> use db1;
Database changed
mysql> create table tb1( id int(4) not null,name varchar(24));
Query OK, 0 rows affected (0.12 sec)

mysql> insert into db1.tb1 values
    -> (1,"Jack");
Query OK, 1 row affected (0.15 sec)

mysql> insert into db1.tb1 values    //寫(xiě)入數(shù)據(jù)
    -> (2,"Kenthy"),
    -> (3,"Bob");
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from tb1;
+----+--------+
| id | name   |
+----+--------+
|  1 | Jack   |
|  2 | Kenthy |
|  3 | Bob    |
+----+--------+
3 rows in set (0.02 sec)

mysql> delete from tb1;
Query OK, 3 rows affected (0.07 sec)

mysql> select * from tb1;
Empty set (0.00 sec)

mysql> exit
Bye

[root@mysql ~]# ls /var/lib/mysql/mysql-bin.*
/var/lib/mysql/mysql-bin.000001  /var/lib/mysql/mysql-bin.000003
/var/lib/mysql/mysql-bin.000002  /var/lib/mysql/mysql-bin.index
[root@mysql ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000003    //查看mysql-bin.000003日志內(nèi)容
......
# at 310
#201223 17:23:29 server id 1  end_log_pos 375 CRC32 0xeb6b5cae  Anonymous_GTID  last_committed=1    sequence_number=2
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 375
#201223 17:23:29 server id 1  end_log_pos 501 CRC32 0x8378de25  Query   thread_id=3 exec_time=0 error_code=0
use `db1`/*!*/;
SET TIMESTAMP=1608715409/*!*/;
create table tb1( id int(4) not null,name varchar(24))
/*!*/;
# at 501
#201223 17:26:25 server id 1  end_log_pos 566 CRC32 0xbe733bf7  Anonymous_GTID  last_committed=2    sequence_number=3
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 566
#201223 17:26:25 server id 1  end_log_pos 643 CRC32 0xc08d9b7f  Query   thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1608715585/*!*/;
BEGIN
/*!*/;
# at 643                       //起啟位置為643
#201223 17:26:25 server id 1  end_log_pos 752 CRC32 0xc2cee70c  Query   thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1608715585/*!*/;
insert into db1.tb1 values                         
(1,"Jack")
/*!*/;
# at 752
#201223 17:26:25 server id 1  end_log_pos 783 CRC32 0xf25ad0e7  Xid = 17
COMMIT/*!*/;
# at 783
#201223 17:27:25 server id 1  end_log_pos 848 CRC32 0x35f44d85  Anonymous_GTID  last_committed=3    sequence_number=4
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 848
#201223 17:27:25 server id 1  end_log_pos 925 CRC32 0xbf81905c  Query   thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1608715645/*!*/;
BEGIN
/*!*/;
# at 925
#201223 17:27:25 server id 1  end_log_pos 1047 CRC32 0x494b097c     Query   thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1608715645/*!*/;
insert into db1.tb1 values
(2,"Kenthy"),
(3,"Bob")
/*!*/;
# at 1047                  
#201223 17:27:25 server id 1  end_log_pos 1078 CRC32 0x45782a98     Xid = 18
COMMIT/*!*/;
# at 1078                      //以1078為截至 
#201223 17:28:48 server id 1  end_log_pos 1143 CRC32 0x92d54ab2     Anonymous_GTID  last_committed=4    sequence_number=5
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1143
#201223 17:28:48 server id 1  end_log_pos 1220 CRC32 0xc58763f7     Query   thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1608715728/*!*/;
BEGIN
/*!*/;
# at 1220
#201223 17:28:48 server id 1  end_log_pos 1307 CRC32 0xc2402c25     Query   thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1608715728/*!*/;
delete from tb1
/*!*/;
# at 1307
#201223 17:28:48 server id 1  end_log_pos 1338 CRC32 0x9be4cbf8     Xid = 20
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
......

也可以通過(guò) show binlog命令查看位置點(diǎn) 更清晰

mysql> show binlog events in "mysql-bin.000003"; 
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                              |
+------------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000003 |    4 | Format_desc    |         1 |         123 | Server ver: 5.7.17-log, Binlog ver: 4                             |
| mysql-bin.000003 |  123 | Previous_gtids |         1 |         154 |                                                                   |
| mysql-bin.000003 |  154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                              |
| mysql-bin.000003 |  219 | Query          |         1 |         310 | create database db1                                               |
| mysql-bin.000003 |  310 | Anonymous_Gtid |         1 |         375 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                              |
| mysql-bin.000003 |  375 | Query          |         1 |         501 | use `db1`; create table tb1( id int(4) not null,name varchar(24)) |
| mysql-bin.000003 |  501 | Anonymous_Gtid |         1 |         566 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                              |
| mysql-bin.000003 |  566 | Query          |         1 |         643 | BEGIN                                   //起啟位置為643            |
| mysql-bin.000003 |  643 | Query          |         1 |         752 | use `db1`; insert into db1.tb1 values
(1,"Jack")                  |
| mysql-bin.000003 |  752 | Xid            |         1 |         783 | COMMIT /* xid=17 */                                               |
| mysql-bin.000003 |  783 | Anonymous_Gtid |         1 |         848 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                              |
| mysql-bin.000003 |  848 | Query          |         1 |         925 | BEGIN                                                             |
| mysql-bin.000003 |  925 | Query          |         1 |        1047 | use `db1`; insert into db1.tb1 values
(2,"Kenthy"),
(3,"Bob")     |
| mysql-bin.000003 | 1047 | Xid            |         1 |        1078 | COMMIT /* xid=18 */                    //以1078為截至            |
| mysql-bin.000003 | 1078 | Anonymous_Gtid |         1 |        1143 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                              |
| mysql-bin.000003 | 1143 | Query          |         1 |        1220 | BEGIN                                                             |
| mysql-bin.000003 | 1220 | Query          |         1 |        1307 | use `db1`; delete from tb1                                        |
| mysql-bin.000003 | 1307 | Xid            |         1 |        1338 | COMMIT /* xid=20 */                                               |
| mysql-bin.000003 | 1338 | Anonymous_Gtid |         1 |        1403 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                              |

注意:起啟和截至位置要包含需要恢復(fù)的位置段,不能等于需要恢復(fù)位置 比如以上的起啟位置不能為752 結(jié)束不能為1047

[root@mysql ~]# mysqlbinlog --start-position="643" --stop-position="1078" /var/lib/mysql/mysql-bin.000003|mysql -u root -p"abc321...A"
mysql: [Warning] Using a password on the command line interface can be insecure.

[root@mysql ~]# mysql -uroot -p"abc321...A"

mysql> use db1
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from db1.tb1;     //恢復(fù)成功
+----+--------+
| id | name   |
+----+--------+
|  1 | Jack   |
|  2 | Kenthy |
|  3 | Bob    |
+----+--------+
3 rows in set (0.01 sec)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容