最高權限管理者是root用戶,它擁有着最高的權限操作。包括select、update、delete、update、grant等操作。那么一般情況在公司之后DBA工程師會創建一個用戶和密碼,去連接數據庫的操作,並給當前的用戶設置某個操作的權限(或者所有權限)。那么這時就需要來簡單了解一下:
-
如何創建用戶和密碼
-
給當前的用戶授權
-
移除當前用戶的權限
如果想創建一個新的用戶,則需要以下操作:
1.進入到mysql數據庫下
mysql> use mysql
Database changed
2.對新用戶增刪改
1.創建用戶: # 指定ip:192.118.1.1的hao用戶登錄 create user 'hao'@'192.118.1.1' identified by '123'; # 指定ip:192.118.1.開頭的hao用戶登錄 create user 'hao'@'192.118.1.%' identified by '123'; # 指定任何ip的hao用戶登錄 create user 'hao'@'%' identified by '123'; 2.刪除用戶 drop user '用戶名'@'IP地址'; 3.修改用戶 rename user '用戶名'@'IP地址' to '新用戶名'@'IP地址'; 4.修改密碼 set password for '用戶名'@'IP地址'=Password('新密碼');
3.對當前的用戶授權管理
#查看權限 show grants for '用戶'@'IP地址' #授權 hao用戶僅對db1.t1文件有查詢、插入和更新的操作 grant select ,insert,update on db1.t1 to "hao"@'%'; # 表示有所有的權限,除了grant這個命令,這個命令是root才有的。hao用戶對db1下的t1文件有任意操作 grant all privileges on db1.t1 to "hao"@'%'; #hao用戶對db1數據庫中的文件執行任何操作 grant all privileges on db1.* to "hao"@'%'; #hao用戶對所有數據庫中文件有任何操作 grant all privileges on *.* to "hao"@'%'; #取消權限 # 取消hao用戶對db1的t1文件的任意操作 revoke all on db1.t1 from 'hao'@"%"; # 取消來自遠程服務器的hao用戶對數據庫db1的所有表的所有權限 revoke all on db1.* from 'hao'@"%"; 取消來自遠程服務器的hao用戶所有數據庫的所有的表的權限 revoke all privileges on *.* from 'hao'@'%';
一 mysqldump指令實現數據備份、mysql指令實現數據還原
DBA到底是做什么的,百科上說:數據庫管理員(Database Administrator,簡稱DBA),是從事管理和維護數據庫管理系統(DBMS)的相關工作人員的統稱,屬於運維工程師的一個分支,主要負責業務數據庫從設計、測試到部署交付的全生命周期管理。DBA的核心目標是保證數據庫管理系統的穩定性、安全性、完整性和高性能。
百科出來的內容總是那么的專業,讓人看完之后的感覺是很解釋的很好,我認為,DBA主要做三件事情:1.保證公司的數據不丟失不損壞 2.提高數據庫管理系統的工作性能
對於現在的公司來講,數據變得尤為重要,可以說最重要,你的網站可以無法訪問,服務器可以宕機,但是數據絕對不能丟。
備份表: 備份其中的某個表: 語法:mysqldump -u 用戶名 -p 庫名 表名> (路徑)備份的文件名 mysqldump -uroot -p crm2 student> f:\數據庫備份練習\crm2_table_student.sql
單純進行表備份的時候,就不用寫-B參數了,因為庫crm2后面就是student表了,也就是說crm2庫還在呢
備份多個表: 語法:mysqldump -u 用戶名 -p 庫名 表名1 表名2> (路徑)備份的文件名
和多個庫一起備份有一個同樣的問題,就是如果只需要恢復某一張表怎么辦,上面的多表備份是不是也不太合適,所以又要進行分表備份 又是同樣的套路,獲取所有的表名,寫一個循環腳本,執行單表備份的指令。 分庫分表備份有些缺點:文件多,很碎,數據量非常大的時候,效率低 1.做一個完整的全備,再做一個分庫分表的備份 2.腳本批量恢復多個sql文件。 備份數據庫表結構: 利用mysqldump -d參數只備份表的結果,例如:備份crm2庫的所有表的結構:
C:\WINDOWS\system32>mysqldump -uroot -p -B -d crm2> f:\數據庫備份練習\crm2stru.sql Enter password: ***
備份出來的文件打開一看,就沒有了插入數據的部分
mysqldump的關鍵參數說明: 1.-B指定多個庫,增加建庫語句和use 語句 2.--compact 去掉注釋,適合調試輸出,生產上不用 3.-A或者--all-databases 例如:C:\WINDOWS\system32>mysqldump -uroot -p -B -A> f:\數據庫備份練習\all.sql Enter password: ***
4.-F刷新binlog日志 5.--master-data 增加binlog日志文件名及對應的為支點。 6.-x,--lock-all-tables 將所有的表鎖住,一般mysql引擎都是鎖表,全部都不能使用了,所有不太友好
7.--add-locks這個選項會在INSERT語句中捆上一個LOCK TABLE和UNLOCK TABLE語句。這就防止在這些記錄被再次導入數據庫時其他用戶對表進行的操作(mysql默認是加上的) 8.-l,--lock-tables Lock all tables for read 9.-d 只備份表結構 10.-t 只備份數據
-
--single-transaction 開啟事務,適合innodb事務數據庫備份,InnoDB表在備份時,通常啟用選項--single-transaction來保證備份的一致性,實際上工作原理時設定本次會話的隔離界別為:REPEATABLE READ,以確保本次會話(dump)時,不會看到其他會話已經提交了數據。
MyISAM全庫備份指令推薦:(gzip是壓縮文件為zip類型的) mysqldump -uroot -p666 -A -B --master-data=2 -x|gzip>f:\數據庫備份練習\all.sql.gz InnoDB全庫備份指令推薦: mysqldump -uroot -p666 -A -B --master-data=2 --single-transaction|gzip>f:\數據庫備份練習\all.sql.gz
數據恢復:
一、通過source命令恢復數據庫 進入mysql數據庫控制台,mysql -uroot -p666登陸后 mysql>use 數據庫; 然后使用source命令,后面參數為腳本文件(如這里用到的是.sql文件,如果你備份的是.txt文件,那這里寫.txt文件)
mysql>source crm2.sql #這個文件是系統路徑下的,默認是登陸mysql前的系統路徑,在mysql中查看系統路徑的方法是通過system+系統命令來搞的 mysql>system ls 二、利用mysql命名恢復(標准) mysql -root -p666 -e "use crm2;drop table student;show tables;" 必須是雙引號 mysql -uroot -p666 crm2<f:\數據庫備份練習\crm2.sql mysql -uroot -p666 -e "use crm2;show tables;"
注:如果sql文件里面沒有use db這樣的字樣時,在導入時就要指定數據庫名了。
mysql -uroot -p666 crm2<.sql文件
建議備份數據庫時都指定上-B參數,效果好
說明:mysql不光可以恢復mysqldump的備份,只要文件中是sql語句,都可以通過mysql命令執行到數據庫中
mysql 帶-e參數實現非交互式對話,就是不需要到mysql里面去,在外面執行里面的指令的方法,例如:mysql -uroot -p666 -e "use crm2;show tables;",但是語句必須是雙引號包裹。
批量恢復庫:找到所有的數據庫名,然后通過庫名去循環恢復
#1. 物理備份: 直接復制數據庫文件,適用於大型數據庫環境。但不能恢復到異構系統中如Windows。 #2. 邏輯備份: 備份的是建表、建庫、插入等操作所執行SQL語句,適用於中小型數據庫,效率相對較低。 #3. 導出表: 將表導入到文本文件中。
一、使用mysqldump實現邏輯備份
#語法: # mysqldump -h 服務器 -u用戶名 -p密碼 數據庫名 > 備份文件.sql #示例: #單庫備份 mysqldump -uroot -p123 db1 > db1.sql mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql #多庫備份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql #備份所有庫 mysqldump -uroot -p123 --all-databases > all.sql
二、恢復邏輯備份
#方法一: [root@localhost backup]# mysql -uroot -p123 < /backup/all.sql #方法二: mysql> use db1; mysql> SET SQL_LOG_BIN=0; mysql> source /root/db1.sql #注:如果備份/恢復單個庫時,可以修改sql文件 DROP database if exists school; create database school; use school;
三、備份/恢復案例
#數據庫備份/恢復實驗一:數據庫損壞 備份: 1. # mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql 2. # mysql -uroot -p123 -e 'flush logs' //截斷並產生新的binlog 3. 插入數據 //模擬服務器正常運行 4. mysql> set sql_log_bin=0; //模擬服務器損壞 mysql> drop database db; 恢復: 1. # mysqlbinlog 最后一個binlog > /backup/last_bin.log 2. mysql> set sql_log_bin=0; mysql> source /backup/2014-02-13_all.sql //恢復最近一次完全備份 mysql> source /backup/last_bin.log //恢復最后個binlog文件 #數據庫備份/恢復實驗二:如果有誤刪除 備份: 1. mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql 2. mysql -uroot -p123 -e 'flush logs' //截斷並產生新的binlog 3. 插入數據 //模擬服務器正常運行 4. drop table db1.t1 //模擬誤刪除 5. 插入數據 //模擬服務器正常運行 恢復: 1. # mysqlbinlog 最后一個binlog --stop-position=260 > /tmp/1.sql # mysqlbinlog 最后一個binlog --start-position=900 > /tmp/2.sql 2. mysql> set sql_log_bin=0; mysql> source /backup/2014-02-13_all.sql //恢復最近一次完全備份 mysql> source /tmp/1.log //恢復最后個binlog文件 mysql> source /tmp/2.log //恢復最后個binlog文件 注意事項: 1. 完全恢復到一個干凈的環境(例如新的數據庫或刪除原有的數據庫) 2. 恢復期間所有SQL語句不應該記錄到binlog中
四、實現自動化備份
備份計划: 1. 什么時間 2:00 2. 對哪些數據庫備份 3. 備份文件放的位置 備份腳本: [root@localhost~]# vim /mysql_back.sql #!/bin/bash back_dir=/backup back_file=`date +%F`_all.sql user=root pass=123 if [ ! -d /backup ];then mkdir -p /backup fi # 備份並截斷日志 mysqldump -u${user} -p${pass} --events --all-databases > ${back_dir}/${back_file} mysql -u${user} -p${pass} -e 'flush logs' # 只保留最近一周的備份 cd $back_dir find . -mtime +7 -exec rm -rf {} \; 手動測試: [root@localhost ~]# chmod a+x /mysql_back.sql [root@localhost ~]# chattr +i /mysql_back.sql [root@localhost ~]# /mysql_back.sql 配置cron: [root@localhost ~]# crontab -l 2 * * * /mysql_back.sql
五、表的導出和導入
SELECT... INTO OUTFILE 導出文本文件 示例: mysql> SELECT * FROM school.student1 INTO OUTFILE 'student1.txt' FIELDS TERMINATED BY ',' //定義字段分隔符 OPTIONALLY ENCLOSED BY '”' //定義字符串使用什么符號括起來 LINES TERMINATED BY '\n' ; //定義換行符 mysql 命令導出文本文件 示例: # mysql -u root -p123 -e 'select * from student1.school' > /tmp/student1.txt # mysql -u root -p123 --xml -e 'select * from student1.school' > /tmp/student1.xml # mysql -u root -p123 --html -e 'select * from student1.school' > /tmp/student1.html LOAD DATA INFILE 導入文本文件 mysql> DELETE FROM student1; mysql> LOAD DATA INFILE '/tmp/student1.txt' INTO TABLE school.student1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '”' LINES TERMINATED BY '\n';
#可能會報錯 mysql> select * from db1.emp into outfile 'C:\\db1.emp.txt' fields terminated by ',' lines terminated by '\r\n'; ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable #數據庫最關鍵的是數據,一旦數據庫權限泄露,那么通過上述語句就可以輕松將數據導出到文件中然后下載拿走,因而mysql對此作了限制,只能將文件導出到指定目錄 在配置文件中 [mysqld] secure_file_priv='C:\\' #只能將數據導出到C:\\下 重啟mysql 重新執行上述語句
六、數據庫遷移
務必保證在相同版本之間遷移 # mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目標IP -uroot -p456