數據庫基礎之04(存儲引擎,密碼修改,用戶授權,權限撤銷,數據備份恢復,增量備份恢復)

目錄

1、 mysql存儲引擎

1-1、什麼是存儲引擎

1-2、常用存儲引擎的特點(myisam   innodb)

1-3、事務(Transactions):一次sql操作從建立連接到操作完成斷開連接的訪問過程稱作事務。

1-4、事務的特點:  ACID

2、修改管數據庫理員root本機登錄密碼(操作系統管理員有權限修改)

2-1、修改密碼

2-2、恢復數據管理員root本機登錄密碼(操作系統管理員有權限恢復)

3、用戶授權

3-1、授權舉例

4、權限撤銷 (刪除新添加用戶的訪問權限)

5、 數據備份與恢復 (DBA )

5-1、物理備份: 備份庫和表對應系統文件

5-2、邏輯備份:

5-3、備份數據和數據恢復:

5-4、完全恢復:mysql

6、增量備份與恢復:

6-1、binlog日誌的使用:

6-2、查看日誌內容

6-3、日誌記錄sql命令格式

6-4執行日誌文件記錄的sql命令恢復數據

6-5、手動生成新的日誌文件的四種方法:

6-6、刪除已有的日誌文件


1、 mysql存儲引擎


1-1、什麼是存儲引擎

存儲引擎是Mysql數據庫服務自帶功能程序,處理表的處理器。每種存儲引擎有不同的功能和數據存儲方式。

查看當前的數據庫服務,支持的存儲引擎
mysql> show  engines;

修改數據庫服務默認使用的存儲引擎
]# systemctl  stop  mysqld
]# vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam
:wq
]# systemctl  start  mysqld

mysql> show  engines;

建表時指定表使用的存儲引擎
create table   t2  (id int) engine=存儲引擎名;
create table   t2  (id int) engine=memory;
create table   t3  (id int) engine=innodb;

修改表使用的存儲引擎
alter  table  表名  engine=存儲引擎名;


查看錶使用的存儲引擎
show  crate  table  表名;

 

1-2、常用存儲引擎的特點(myisam   innodb)

myisam 存儲引擎特點

  • 支持表級鎖  (客戶端連接數據庫服務器後,對錶的數據做訪問時,若表的存儲引擎是myisam的話,會給整張表加鎖)
  • 不支持事務和事務回滾

每個表對應3個表文件

  • 表.frm    表結構數據      desc  表
  • 表.MYD  表數據
  • 表.MYI   表的index索引信息   

InnoDB的特點

  • 支持行級鎖(客戶端連接數據庫服務器後,對錶的數據做訪問時,若表的存儲引擎是innodb的話,會只給表中被訪問的行加鎖)
  • 支持外鍵、事務和事務回滾   

鎖類型:

  • 讀鎖(共享鎖)  當對一張表執行查詢(select)操作時 會加讀鎖
  • 寫鎖(排他鎖或互斥鎖) 當對一張表執行寫(insert update  delete)操作時 會加寫鎖

每個表對應2個表文件  

  • 表.frm  表結構數據
  • 表.ibd   表數據和index索引

爲了幫助大家更好的區分讀寫鎖和(表級鎖行級鎖),我將讀寫鎖叫做權限鎖(決定了加鎖後用戶有哪些操作權限),將表級鎖行級鎖叫做對象索(決定將鎖加在某一行還是整張表)。

此外值得注意的是:

衆多資料中都說innodb使用的是行級鎖,但實際上是有限制的。只有在你增刪改查時匹配的條件字段帶有索引時,innodb纔會使用行級鎖,在你增刪改查時匹配的條件字段不帶有索引時,innodb使用的將是表級鎖。因爲當你匹配條件字段不帶有所引時,數據庫會全表查詢,所以這需要將整張表加鎖,才能保證查詢匹配的正確性。在生產環境中我們往往需要滿足多人同時對一張表進行增刪改查,所以就需要使用行級鎖,所以這個時候一定要記住爲匹配條件字段加索引。

提到行級鎖和表級鎖時我們就很容易聯想到讀鎖和寫鎖,因爲只有觸發了讀寫鎖,我們纔會談是進行行級鎖定還是進行表級鎖定。那麼什麼時候觸發讀鎖,就是在你用select 命令時觸發讀鎖,什麼時候觸發寫鎖,就是在你使用update,delete,insert時觸發寫鎖,並且使用rollback或commit後解除本次鎖定。

 

1-3、事務(Transactions):一次sql操作從建立連接到操作完成斷開連接的訪問過程稱作事務。

支持事務的可以做事務回滾 :一次sql操作有任意一步沒有執行成功會恢復所有操作。(對innodb存儲引擎的表 訪問時 必須任意一步操作都成功,才能完成操作。)

事務操作比如: 銀行的匯款或轉賬業務

插卡  --->輸入密碼 --->登錄成功
轉賬    卡號   XXXXXX
          金額   50000
                                           確定
           轉賬成功   -50000    +50000
                                            退卡

innodb存儲引擎的表有對應的事務文件記錄所有SQL命令
cd /var/lib/mysql/
ibdata1
ib_logfile0
ib_logfile1


mysql> set  autocommit=off;
mysql> show  variables  like "autocommit"; 
commit ;  手動提交
rollback;  回滾操作

 

1-4、事務的特點:  ACID

事務具有四個特徵:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續性( Durability )。這四個特性簡稱爲 ACID 特性。

1 .原子性 

事務是數據庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做 

2 .一致性 

事 務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。如果數據庫系統 運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是 不一致的狀態。

3 .隔離性 

一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的數據對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。 

4 .持續性 

也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。 

 

 

總結:

工作中建表時,如何決定表使用的存儲引擎

  • 執行查詢操作多的表適合使用myisam存儲引擎,節省系統資源。
  • 執行寫操作多的表適合使用innodb存儲引擎,這樣併發訪問量大。

     


2、修改管數據庫理員root本機登錄密碼(操作系統管理員有權限修改)

 

2-1、修改密碼

mysqladmin  -hlocalhost -uroot  -p   password  "新密碼"

[root@host50 ~]# 
mysqladmin  -hlocalhost -uroot -p password   "123qqq...A"
Enter password:    當前登錄密碼


2-2、恢復數據管理員root本機登錄密碼(操作系統管理員有權限恢復)

]# systemctl  stop  mysqld
]#  vim /etc/my.cnf
[mysqld]
skip_grant_tables-----取消權限設置,即再沒有權限限制
:wq
]# systemctl  start  mysqld
]# mysql
mysql> 
select  host,user,authentication_string from mysql.user;

mysql> update  mysql.user   set  authentication_string=password("123456")  where  user="root"  and  host="localhost";

mysql> flush privileges;

mysql> quit;

flush privileges 命令本質上的作用是將當前user和privilige表中的用戶信息/權限設置從mysql庫(MySQL數據庫的內置庫)中提取到內存裏。MySQL用戶數據和權限有修改後,希望在"不重啓MySQL服務"的情況下直接生效,那麼就需要執行這個命令。通常是在修改ROOT帳號的設置後,怕重啓後無法再登錄進來,那麼直接flush之後就可以看權限設置是否生效。而不必冒太大風險。


3、用戶授權

 在數據庫服務器上添加新的連接用戶名,默認只有數據庫管理員root用戶在數據庫服務器本機登錄有授權權限。默認情況下管理員只能從數據庫本機連接服務,再沒有其他用戶能夠連接數據庫服務器了。

授權命令格式:
]# mysql  -uroot  -p123456
mysql>
grant    權限列表  on   數據庫名  to  用戶名@" 客戶端地址"   
identified   by   "密碼"   [ with  grant option];


with  grant option  可選, 讓添加的用戶連接服務器後,也有授權權限。
identified   by   "密碼"   新添加的用戶連接數據庫服務器時,使用的密碼

客戶端地址  作用:網絡中的那些主機可以使用新添加的用戶連接數據庫服務器。有如下表示方式:

  • 所有主機    %
  • 網段  192.168.4.%
  • 指定主機   192.168.4.51
  • 本機         localhost
  • 主機名    pc1.tedu.cn  
  • 域名   %.tedu.cn

用戶名   客戶端主機連接數據庫服務器時使用的名字,授權時自定義既可,名字要有標識性。

數據庫名 : 新添加的連接用戶,訪問後可以操作的庫,表示方式如下:

  • *.*             所有庫 所有表
  • 庫名.*        庫下的所有表
  • 庫名.表明   某張表

權限列表 : 新添加的連接用戶,對可以操作的庫的訪問權限,權限的表示方式如下:

  • all   所有權限
  • 命令  某種權限   (例如  select , insert ,delete) 

授權庫 mysql 庫記錄授權信息,使用不同的表記錄不同的授權信息

  • user ---- 記錄已經添加的連接所有用戶名
  • db--------僅記錄已添加的連接用戶對庫的訪問權限
  • tables_priv------- 僅記錄已--添加的連接用戶對錶的訪問權限
  • columns_priv----- 僅記錄已添加的連接用戶對錶字段的訪問權限

 

  • desc  user;
  • desc db;
  • desc tables_priv;
  • desc    columns_priv;

 

 

  • select  *  from  user\G;
  • select  *  from  db;
  • select  *  from  tables_priv;
  • select  * from  columns_priv;

select user  from mysql.user;
select user,host from mysql.user;-------可以查看給哪些用戶用什麼主機登陸的權力


show grants  for  用戶@"客戶端地址";---------查看授權用戶的訪問權限 

show grants  for  root@"localhost";
select  * from user where  user="root" and  host="localhost"\G;


3-1、授權舉例


在50服務器上添加用戶admin
mysql> grant  select,insert  on  db3.*   to  admin@"192.168.4.%"  identified  by  "123qqq...A";

mysql> select user  from mysql.user where user="admin"; 

在客戶端51使用服務新添加的用戶連接主機50 驗證例子1 授權
]# mysql -h192.168.4.50 -uadmin  -p123qqq...A
mysql> select @@hostname;---------查看當前登陸的數據庫是哪個數據庫
mysql> select user();-----查看當前登錄的用戶名
mysql> show  grants;-----查看被授予的權限
mysql> 執行sql命令驗證權限

授權例子2
在50服務器 授權主機52 可以使用root 連接自己,對所有庫表有完全權限且有授權權限 登錄密碼是123qqq...A

grant  all  on   *.*   to   root@"192.168.4.52"   identified  by  "123qqq...A"   with  grant  option;

在客戶端使用服務新添加的用戶連接主機50 驗證例子2 授權
[root@host52 ~]# mysql  -h192.168.4.50  -uroot  -p123qqq...A
mysql> select @@hostname;
mysql> select user();
mysql> show  grants;
mysql> 測試對庫表的訪問權限
mysql>  grant  select,update(name,uid)  on  db3.user  to  webuser@"%"  identified by "123qqq...A";  #測試授權權限

在客戶端使用有授權權限用戶 添加用戶連接數據庫服務器50
]#  mysql  -h192.168.4.50  -uwebuser  -p123qqq...A
mysql> show  grants;
mysql> 測試訪問權限

在50主機上查看授權信息
select  user,host from mysql.user;
select  * from  mysql.db \G;
select  * from  mysql.tables_priv \G;
select  * from  mysql.columns_priv \G;


4、權限撤銷 (刪除新添加用戶的訪問權限)


4-1、MySQL> revoke  權限  on  數據庫名   from  用戶名@"客戶端地址";

select user,host  from mysql.user;
show  grants  for  root@"192.168.4.52";

revoke   grant option  on  *.*  from  root@"192.168.4.52";
show  grants  for  root@"192.168.4.52";

select  *  from  mysql.user where  user="root" and  host="192.168.4.52"\G;

4-2、修改記錄的方式 撤銷用戶的權限
mysql> update  mysql.user  set   Delete_priv="N" where  user="root" and  host="192.168.4.52";
MySQL>flush  privileges;


select  *  from  mysql.user where  user="root" and  host="192.168.4.52"\G;

revoke  all  on  *.*   from  root@"192.168.4.52";
show  grants  for  root@"192.168.4.52";


4-3、刪除授權用戶 (刪除添加的連接用戶)
mysql> drop   user   用戶名@"客戶端地址";
mysql> drop   user   root@"192.168.4.52";


SELECT, INSERT, UPDATE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE 


4-4、修改密碼:


授權用戶連接數據庫服務器後修改連接密碼
mysql> set  password=password("新密碼");

管理員重置授權用戶的連接密碼
mysql> set password for 用戶名@"客戶端地址"=password("新密碼");
 

 

5、 數據備份與恢復 (DBA )


5-1、物理備份: 備份庫和表對應系統文件


50:
cp  -r  /var/lib/mysql     /dbdir.bak
cp  -r  /var/lib/mysql/mysql    /mysqldb.bak
cp  -r  /var/lib/mysql/mysql/db.*   /root/ 
tar  zcvf   /mysql.tar.gz  /var/lib/mysql/*  

scp    -r   /mysqldb.bak   192.168.4.51:/root/

恢復   把備份的文件拷貝會對應的數據庫目錄,把所有者和組修改爲mysql  重啓數據庫服務器。
51:
systemctl  stop  mysqld
rm  -rf /var/lib/mysql/mysql
cp -r  /root/mysqldb.bak   /var/lib/mysql/mysql
chown  -R  mysql:mysql  /var/lib/mysql/mysql
systemctl  start  mysqld

 

5-2、邏輯備份:

  •  執行備份命令時,根據備份的庫表 生產對應的sql命令,把命令保存到指定的文件裏。恢復時,執行保存sql命令的備份文件 把數據寫回數據庫裏。

 

  • 數據備份策略

完全備份   備份所有數據(通常包括3類對象: 一張表裏的所有數據   一個庫的所有表    一臺數據庫服務器的所有數據)

只備份新產生的數據:
差異備份: 備份自完全備份,後所有新產生的數據
增量備份: 備份上次備份後,所有新產生的數據


完全+差異
完全+增量 *

工作中使用crond服務 執行備份腳本(在備份腳本調用備份命令)做數據備份

00  23   *  *  1      /root/allbak.sh
00  23   *  *  2-7 /root/newbak.sh
++++++++++++++++++++++++++++++

5-3、備份數據和數據恢復:

完全備份:mysqldum 
]# man  mysqldump
]# mysqldump   -uroot   -p123456   庫名  > 目錄名 /文件名.sql

庫名的表示方式:
--all-databases  或  -A   所有庫所有表

  • 庫名     備份庫下的所有表
  • 庫名 表名      備份一張的所有記錄
  • -B 庫名1  庫名2    備份某幾個庫的所有數據

5-4、完全恢復:mysql

  1. ]#mysql  -uroot  -p123456    庫名  <  目錄名 /文件名.sql-------這裏的庫名可以和原庫名一樣也可以不一樣
  2. mysql>  source   目錄名 /文件名.sql-------恢復到當下目錄位置

]# mkdir  /bakdir
]# mysqldump -uroot -p123456  -A  > /bakdir/alldb.sql

]# mysqldump -uroot -p123456  db3  > /bakdir/db3.sql

]# mysqldump -uroot -p123456  db3 user > /bakdir/db3-user.sql

]# mysqldump -uroot -p123456  -B db3 db55 > /bakdir/twodb.sql


50:
mysql> drop  table db3.user;
mysql> select  * from db3.user;
]# mysql  -uroot -p123456   db3  <  /bakdir/db3-user.sql


mysql> drop  database  db3;
mysql>  create  database  db3;
]#  mysql  -uroot -p123456   db3  <  /bakdir/db3.sql

總結:備份數據庫    mysqldump   -uroot   -p123456   庫名  > 目錄名 /文件名.sql

庫名的表示方式:
--all-databases  或  -A   所有庫所有表

  • 庫名     備份庫下的所有表
  • 庫名 表名      備份一張的所有記錄
  • -B 庫名1  庫名2    備份某幾個庫的所有數據

恢復數據庫: 

mysql -uroot -p123456 < 完全備份.sql

mysql -uroot -p123456  新建的庫(庫名可以與原庫名相同也可不同) < 1到多個庫備份.sql

mysql -uroot -p123456     庫名(可以是新建庫,也可以是當前已有的庫)<表備份.sql

注意:

  • mysqldump   備份和恢復會鎖表

vim /bakdir/db3-user.sql
lock  tables   user   write
insert  into  

案例:每週一  23點備份數據庫服務器上db3庫下的所有表到系統的/bakdir目錄。

]# vim  /root/alldb3.sh
#!/bin/bash
if [ ! -e  /bakdir ];then
   mkdir   /bakdir
fi       
x=`date  +%F`
mysqldump   -uroot  -p123456  db3   >  /bakdir/db3_${x}.sql  
:wq

]#chmod  +x  /root/alldb3.sh 

]# /root/alldb3.sh 
]# ls  /bakdir

]# crontab  -e
00  23  * *  1    /root/alldb3.sh      &>  /dev/null
:wq

 

6、增量備份與恢復:

  • 啓用MySQL服務自帶的binlog日誌 文件

 

6-1、binlog日誌的使用:

日誌介紹:是服務日誌文件中的一種(默認沒有啓用) 記錄除查詢之外的sql命令.
select     show tables   desc   show  databases---------  查
insert   update   delete-------- 寫

啓用日誌
[mysqld]
server_id=50
log-bin--------啓用binlog日誌
binlog-format="mixed"

host50-bin.000001    日誌文件   > 500M
host50-bin.index       索引文件-----記錄已有日誌文件名


6-2、查看日誌內容

]# mysqlbinlog    host50-bin.000001 


自定義binlog日誌名稱及存儲目錄
[root@host50 ~]# mkdir /logdir
[root@host50 ~]# chown  mysql  /logdir/----一定要將新建的目錄所屬者改爲mysql,才能被mysqld程序調用

vim /etc/my.cnf
[mysqld]
log-bin=/logdir/db50-----定義了日誌文件不再儲存在/var/log/mysql下,
而是存儲在/logdir下,並且定義了日誌文件名前綴爲db50

:wq

]#  systemctl  restart   mysqld

]# mysqlbinlog   /logdir/db50.000001

 

6-3、日誌記錄sql命令格式

偏移量   
時間點

]# mysqlbinlog 選項  /logdir/db50.000001

--start-position=數字
--stop-position=數字

--start-datetime="yyyy-mm-dd  hh:mm:ss"
--stop-datetime="yyyy-mm-dd  hh:mm:ss"

6-4執行日誌文件記錄的sql命令恢復數據

]# mysqlbinlog 選項  日誌文件名   |  mysql  -uroot -p123456


]#  mysqlbinlog   --start-position=616   --stop-position=794  /logdir/db50.000001  |  mysql  -uroot -p123456
  
 


]#  mysqlbinlog   --start-datetime="2018-07-17 14:21:15"   
--stop-datetime="2018-07-17 14:21:18"  /logdir/db50.000001  |  mysql  -uroot -p123456
  

mysql> show master status; 查看正在使用的日誌信息


6-5、手動生成新的日誌文件的四種方法:

  1. ]# systemctl  restart mysqld
  2. ]# mysql -uroot -p123456  -e "flush logs"
  3. mysql> flush logs;
  4. ]# mysqldump  -uroot  -p123456  --flush-logs  db3  >  /bakdir/db3.sql

 

6-6、刪除已有的日誌文件

mysql>  purge  master  logs  to  "db50.000005";------刪除000001--000005的的所有binglog日誌文件
mysql> reset  master;-----------功能說明:刪除所有的binglog日誌文件,並將日誌索引文件清空,重新開始所有新的日誌文件。用於第一次進行搭建主從庫時,進行主庫binlog初始化工作;
]#rm  -rf /logdir/*

發佈了41 篇原創文章 · 獲贊 20 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章