目錄
1-3、事務(Transactions):一次sql操作從建立連接到操作完成斷開連接的訪問過程稱作事務。
2、修改管數據庫理員root本機登錄密碼(操作系統管理員有權限修改)
2-2、恢復數據管理員root本機登錄密碼(操作系統管理員有權限恢復)
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
- ]#mysql -uroot -p123456 庫名 < 目錄名 /文件名.sql-------這裏的庫名可以和原庫名一樣也可以不一樣
- 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、手動生成新的日誌文件的四種方法:
- ]# systemctl restart mysqld
- ]# mysql -uroot -p123456 -e "flush logs"
- mysql> flush logs;
- ]# 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/*