一、創建用戶
create user 'xy104'@'192..168.42.24' identified by '123456';
xy104:用戶名
localhost;這個權限最高的root用戶
%:任務ip地址
192.168.42.24:登錄的IP地址
identified by ‘123456’:指定該用戶的密碼
mysql -h 192.168.42.24 -u xy104 -p123456
#在命令行遠程登錄數據庫
二、賦權和解除權限
grant:用于授予用戶對數據庫對象的訪問權限
all:所有,增刪改查所有命令
grant select,insert on xyjy.* to 'xy104'@'192.168.42.24';
#賦予xyjy數據庫內的xy104用戶查詢和增加的權限
刪除權限
revoke:刪除權限
revoke delete on xyjy.* from 'xy104'@'192.168.42.24';
#刪除xyjy數據庫內的xy104用戶的權限
三、刪除用戶
drop user 'xy104'@'192.168.42.24';
#刪除xy104用戶
修改密碼
vim /etc/my.cnf
skip-grant-table
#免密登錄
保存退出
mysql -u root -p
update user set authentication_string = '' where user='root';
selsct host,user,authentication_string,plugin from user;
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
四、刪除表內數據
刪除表內數據,到那時保留表名和表的結構
方法1:
delete from 表名;
如果該表有自增長的字段,delete刪除之后,會保留之前的自增長記錄
方法2:
truncate table 表名
全部清空,自增長記錄也會從1開始
五、mysql的索引
索引在所有的關系型數據庫當中的都有,索引是一個排序的列表,在這個列表當中存儲了索引的值和這個值對應數據所在的物理地址。
使用了索引之后,查詢數據表時,可以不用全表掃描來定義數據所在行。
可以通過索引直接找到該行數據對應的物理地址,直接訪問數據,提高查詢的速度,合理的設置索引可以提高數據庫查詢速度,也是必備的一項操作
索引的作用
索引的好處
1、索引就相當于書本的目錄,當表很大(數據量多)或者查詢涉及到多個表時(不超過3個),使用索引可以提高成千上萬倍的查詢速度
2、可以降低數據庫的l/o成本,索引也會降低數據庫的排序成本
3、也可以創建唯一性索引
4、可以加快表與表之間的連接速度
5、使用索引可以減少分組和排序的時間
6、通過索引可以提高數據庫的恢復速度
索引的副作用
1、索引也需要占用磁盤的空間
2、更新一個有索引的表比更新沒有索引的表時間更長,因為索引也需要更新
索引的創建原則
索引的創建原則:
雖然索引可以提高訪問速度,但是也不是任何情況下都需要索引
在有索引的情況下,數據庫會先查索引然后再定位到數據行
索引的設置如果不合理,反而會增加數據庫的負擔
1、表的主鍵和外鍵必須有索引,但是主鍵和外鍵默認就是索引
2、超過300行的表數據,就需要添加索引
3、和其他表連接的字段,要建立索引
4、唯一性差的字段,不適合設置索引
5、字段更新頻繁,不適合索引
6、經常出現在where條件的字段當中的,尤其是大表,應該建立索引
7、在經常進行group by和order by ,要創建索引
索引的類型
mysql的索引默認就是B-TREE索引
葉子節點上包含的條目直接指向到數據行,葉子節點之間也互相連接,形成了一個向下延伸的指針
根據索引值一步一步定位到數據行
哈希索引:它是把索引值轉換成值,通過對應索引的hash值找到對應數據行
索引的創建
主鍵索引:創建了主鍵默認就是索引
explain select * from member (name(5));
普通索引
create index name_index on member (name(5));
#name(5):列名當中匹配的長度,在不損失精確性的情況下,長度越小越好,減少索引文件的大小create table if not exists xy104 (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50),
index name_index (name)
);唯一索引,該字段的值必須是唯一的,膽識可以為空,天價唯一約束,自動就是唯一索引
create table if not exists xy104 (
id int(4) zerofill primary key ,
name varchar(10) unique key,
cardid int(18) ,
hobby varchar(50),
);create unique index name_index on member (name(5));組合索引:可以是單字段的索引,也可以是多字段的組合
要滿足最左原則,select的查詢語句的where條件,是從左往右執行的,字段的組合要符合索引的排序
create table if not exists xy104 (
id int(4) zerofill primary key ,
name varchar(10) unique key,
cardid int(18) ,
hobby varchar(50),
unique index cardid phone address (cardid, phone, address)
);alter table member4 add constraint uc_cardid_phone_address unique (cardid ,phone,address )全文索引:適合使用模糊查詢進行匹配時使用,用來檢索文章當中的信息
create fulltext index remark——index on members(remark)
#創建索引
select * from member3 where match(remark) against(‘第八集’)
索引:
主鍵索引 創建了主鍵默認就是索引
普通索引 最常見的一種索引方式
唯一索引: 創建唯一約束就是唯一索引,唯一索引的值可以是null
組合索引: 多個字段結合起來成為共同。
全文索引: 大文本的匹配。
match---->列 against------>文本
六、mysql的事務和存儲引擎
mysql innodb自帶了事務的特性
原子性
一致性
隔離性
持久性
隔離性
隔離性:每個事務執行的過程時獨立的,互相不能被干擾,并發事務之間是獨立的
1、臟讀
A事務在訪問數據并且修改了數據,但是修改的結果沒有提交到數據庫,
B事務也訪問了這條數據,而且看到了未提交的結果。
2、不可重復讀: 在一個事務之內,多次讀同一數據。
這A事務沒有結束時,另一個B事務也訪問該數據,由于在A事務中兩次讀取數據,在中間B事務修改了數據,
導致A事務兩次查詢的結果是不一致的,這就是不可重復讀,不能讀到相同的數據。
3、幻讀:A事務對數據進行了修改,B事務也對數據進行了修改,A事務發現數據還是沒有修改的數據,產生了幻覺。
事物的隔離級別
mysql支持事務四種隔離級別:
1、未提交讀,允許臟讀,可以看到未提交的修改 read uncimmitted
2、提交讀,read committed提交讀,只允許看到修改提交之后的數據
begin 顯示開始一個事務
update cost set money=150 where id =1
commit 提交 事務,所有的修改都是永久性
3、可重復讀,mysql默認隔離級別,一個事務在執行兩次select語句,保證得到相同的結果
update cost set money=150 where id =1
4、串行讀,后一個事務必須等待前一個完成之后才能繼續,在這個過程中表會完全鎖住,讀寫都活阻塞
事務的控制語句
begin:顯示開始一個事務
commit:提交事務,所有的修改都是永久性
rollback:對事務進行回滾,返回到上一次的操作,只能回滾正在進行未提交的修改
savepoint:在事務當中創建一個回滾點,回滾到指定的位置,一個事務中可以有多個回滾點。
savepoint在一個事務當中是一個臨時的標記,在事務執行過程中的一個回滾點,多個回滾點,是按照順序進行的,
前面的回滾點一旦執行,后續的回滾點就回失效。
七、行鎖和死鎖
innodb的行鎖和死鎖
行鎖
innodb通過給索引加鎖來實現行級的鎖定,如果沒有索引,會使用隱藏的聚簇索引來實施實現鎖定
如果A事務對索引字段進行操作,就會觸發聚簇索引,鎖定整行,B事務對這個行進行的操作都會被鎖住
死鎖
兩個事務相互等待對方的資源,形成了一個環路導致的
for update:設置一個排他鎖,在當前事務未提交前,禁止事務的寫入和更新操作
死鎖發生會自動選擇一個事務當中的語句進行執行,直接終止其中的一個事務,回滾另外一個事務,以解除死鎖
如何避免死鎖的發生
1、按照固定的順序對表和行進行訪問
2、大事務拆成小事務,業務允許的情況下
3、調整事務的默認隔離級別,如果業務允許,隔離級別越低越好
4、要給表添加合適的索引(不是經常需要訪問的字段,最好不要設置索引。)
八、mysql的備份和還原以及日志管理
備份的目的就是災難恢復
數據庫備份的分類:
1、物理備份
冷備份:關閉數據庫進行備份的,全量備份
2、邏輯備份***
熱備份:數據庫可以正常運行,不影響數據庫的操作,在這個條件可以實現備份和恢復
備份策略:
全量備份
增量備份
冷備份只能進行全量備份,邏輯備份既可以實現全量,也可以實現增量
mysqldump,常用的邏輯備份的工具,mysql自帶的。
全量備份,物理冷備份:
tar -jcvf /opt/mysql_all_$(date+%F).tar.xz /usr/local/mysql/data
把mysql的date目錄,打包的格式.xz,保存到opt的目錄下
mysqldump的備份和恢復
mysqldump是針對庫和表的全量和增量,使用的是熱備份
把備份的庫和表,以文件的形式導出,再從導出的文件進行恢復
mysqldump -u root -p123456 --databases xyjy > /opt/xyjy.sql
--databases:指定庫
把xyjy庫備份到/opt/xyjy.sql目錄下
mysql -u root -p123456 < /opt/xyjy.sql
把xyjy庫重新導入到mysql數據庫
mysqldump -u root -p123456 xyjy cost > /opt/xyjy.sql
把xyjy庫中的cost表備份到/opt/xyjy.sql
mysql -u root -p123456 xyjy < /opt/xyjy.sql
把表恢復到指定庫中
直接在命令行輸入命令
對于數據的備份和恢復***
熱備份
使用mysql的二進制日志的方式進行備份,對數據的全量或者是增量
基于位置的恢復
基于時間點的恢復
打開/etc/my.cnf
先要剋期二進制日志的功能
log-bin=mysql-bin
開啟二進制日志的功能,二進制文件的名稱mysql-bin.000001
binlog_format=MIXED
二進制日志的記錄格式
log-error=/usr/local/mysql/data/mysql-error.log
#記錄mysql在啟動,停止或者是運行時,產生錯誤的日志
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#開啟mysql在使用過程中的記錄日志
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5
#開啟慢查詢日志,用來記錄所有查詢的時間超過long_query_time=5的記錄,查詢的執行時間超過5秒鐘就會記錄。
不注明,默認10秒
vim /etc/my.cnflog-bin=mysql-binbinlog_format=MIXEDlog-error=/usr/local/mysql/data/mysql-error.loggeneral_log=ONgeneral_log_file=/usr/local/mysql/data/mysql_general.logslow_query_log=ONslow_query_log_file=/usr/local/mysql/data/mysql_slow_query.loglong_query_time=5
二進制日志的記錄格式:
1、ROW 基于行
記錄每一行的數據,準確,但是恢復效率低
2、STATEMENT 基于sql語句
按照順序對sql語句進行記錄,高并發的情況下,sql的記錄有可能會出錯,可能會導致數據的記錄有偏差,雖然恢復的效率比較高
3、MIXED 混合
正常情況下使用STATEMENT,高并發自動切換ROW的記錄方式
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001可以解讀二進制日志mysql-bin.000001進行解析
mysqlbinlog --no-defaults mysql-bin.000001 |mysql -u root -p 123456
恢復增量
mysqladmin -u root -p123456 flush-logs
刷新,打斷點
我們是按天來執行的,我們就可以按天對數據庫進行增量的備份
mysqlbinlog --no-defaults --start-position=‘1338’ mysql-bin.000005 | mysql -u root -p123456
這個命令從指定的位置(位置1338)開始恢復數據,一直恢復到文件的結尾。
mysqlbinlog --no-defaults --stop-position=‘1338’ mysql-bin.000005 | mysql -u root -p123456
這個命令從文件的開始位置恢復數據,直到指定的結束位置(位置1338)
從指定位置開始到指定位置結束
mysqlbinlog --no-defaults --start -position=‘2364’ --stop-position=‘3235’ mysql-bin.000001 | mysql -u root -p123456
從指定時間開始到指定時間結束
mysqlbinlog --no-defaults --start -datetime=‘2024-12-20 13:47:17’ --stop-datetime=‘2024-12-20 13:47:38’ mysql-bin.000001 | mysql -u root -p123456