MySQL 權限經(jīng)驗原則:
權限控制主要是出于安全因素,因此需要遵循一下幾個經(jīng)驗原則:
只授予能滿足需要的最小權限,防止用戶干壞事。比如用戶只是需要查詢,那就只給 select 權限就可以了,不要給用戶賦予 update、insert 或者 delete 權限。
2、創(chuàng)建用戶的時候限制用戶的登錄主機,一般是限制成指定 IP 或者內(nèi)網(wǎng) IP 段。@’192.168.1.28’hostname
3、初始化數(shù)據(jù)庫的時候刪除沒有密碼的用戶。安裝完數(shù)據(jù)庫的時候會自動創(chuàng)建一些用戶,這些用戶默認沒有密碼。
4、為每個用戶設置滿足密碼復雜度的密碼。CRM 疑是地上霜 CRM14floor&& 雙
5、定期清理不需要的用戶。回收權限或者刪除用戶。帳號審計查看:
mysql> use mysql;
mysql> select database();
+------------+
| database() |
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)
mysql> select * from user\G
*************************** 1. row ***************************
Host: localhost
User: root
Password: *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
總結:
存儲權限的表有:
1、user 表
2、db 表
3、host 表
4、table_priv 表
5、columns_priv 表
每個授權表包含范圍字段和權限字段。
MySQL 權限實戰(zhàn):
1、查看用戶權限mysql> select * from mysql.user\G 查看所有
mysql> select * from mysql.user where user='root' and host='localhost'\G 精確查看
查看當前用戶權限:
查看某個用戶的權限:
mysql 創(chuàng)建用戶并授權---grant 的用法
格式:grant 權限 on 數(shù)據(jù)庫名.表名 to 用戶@登錄主機 identified by "用戶密碼";
grant[英][grɑ:nt] 承認; 同意; 準許; 授予;
例1:允許tree用戶從localhost登錄
mysql> grant all on book.* to tree@localhost identified by "123456";
grant 命令說明:
ALL PRIVILEGES 是表示所有權限,你也可以使用 select、update 等權限
ON 用來指定權限針對哪些庫和表。
. 中前面的號用來指定數(shù)據(jù)庫名,后面的號用來指定表名。
TO 表示將權限賦予某個用戶。
tree@'localhost'表示 HA 用戶,@后面接限制的主機,可以是 IP、IP 段、域名以及%,%表示任何地方。注意:
這里%有的版本不包括本地,以前碰到過給某個用戶設置了%允許任何地方登錄,但是在本地登錄不了,這個和版本有關系,遇到這個問題再加一個 localhost 的用戶就可以了。
IDENTIFIED BY 指定用戶的登錄密碼。
WITH GRANT OPTION 這個選項表示該用戶可以將自己擁有的權限授權給別人。注意:經(jīng)常有人在創(chuàng)建操作用戶
的時候不指定 WITH GRANT OPTION 選項導致后來該用戶不能使用 GRANT 命令創(chuàng)建用戶或者給其它用戶授權。
備注:可以使用 GRANT 重復給用戶添加權限,權限疊加,比如你先給用戶添加一個 select 權限,然后又給用戶添
加一個 insert 權限,那么該用戶就同時擁有了 select 和 insert 權限。
允許tree2用戶從任意遠端主機連接mysql服務器:
mysql> grant all privileges on . to tree2@'%' identified by '123456' with grant option;
with grant option 意思是 tree2 用戶可以把自己的權限下放給新創(chuàng)建的用戶。 另外,加不加 privileges 都可
以。
測試:
[root@xuegod64 ~]# mysql -u tree2 -h 192.168.1.63 -p123456
mysql> #登錄正常
但是:
[root@xuegod63 ~]# mysql -u tree2 -h 192.168.1.63 -p123456 #不能登錄
解決方法:
mysql> grant all privileges on . to 'tree2'@'192.168.1.63' identified by '123456' with grant
option;
[root@xuegod63 ~]# mysql -u tree2 -p123456 #不能登錄
解決方法:
mysql> grant all privileges on . to 'tree2'@'localhost' identified by '123456' with grant option;
總結: % 指的是任意遠程主機,不包括本地地址和localhost。 另外grant是立即生效。不需要執(zhí)行:mysql>
flush privileges;
只有手動修改了mysql相關字段,才需要執(zhí)行mysql> flush privileges;
只授權部分權限:
mysql> grant select,insert,update,delete,create,drop on aa.* to 'custom'@'localhost' identified by '123456';
方法二: 直接修改表中權限文件:
mysql> use mysql;
mysql> insert into user (Host,User,Password) values('localhost','grace','123456');
mysql> select Host,User,Password from user where User="grace";
+-----------+-------+----------+
| Host | User | Password |
+-----------+-------+----------+
| localhost | grace | 123456 |
+-----------+-------+----------+
可以看到密碼是明文存放的,現(xiàn)在以加密方式存儲:
mysql> insert into user (Host,User,Password) values('localhost','grace1',password("123456"));
Query OK, 1 row affected, 3 warnings (0.00 sec)
mysql> select Host,User,Password from user where User="grace1";
+-----------+--------+-------------------------------------------+
| Host | User | Password |
+-----------+--------+-------------------------------------------+
| localhost | grace1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-----------+--------+-------------------------------------------+
1 row in set (0.01 sec)
mysql> flush privileges; #刷新權限表,使配置文件生效
或重啟mysql 數(shù)據(jù)庫使用這個命令使權限生效,尤其是你對那些權限表 user、db、host 等做了 update 或者 delete 更新的時候。以前遇到過使用 grant 后權限沒有更新的情況,只要對權限做了更改就使用 FLUSH PRIVILEGES 命令來刷新權限。
mysql> flush privileges;
[root@xuegod63 ~]# service mysqld restart
測試:
[root@xuegod63 ~]# mysql -u grace -p123456 #登錄不成功
ERROR 1045 (28000): Access denied for user 'grace'@'localhost' (using password: YES)
[root@xuegod63 ~]# mysql -u grace1 -p123456 #登錄成功
回收權限
mysql> revoke delete on *.* from 'tree'@'localhost';42.7 修改 mysql 用戶密碼
42.7.1 grant 修改立即生效
mysql> grant all on book.* to mk1@localhost identified by "123456";
mysql> grant select,insert,update,delete,create,drop on aa.* to 'custom'@'localhost' identified
by '123456';
測試:
[root@xuegod63 ~]# mysql -u mk1 -p123456
[root@xuegod63 ~]# mysql -u custom -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| book |
| test |
設置帳戶密碼:
[root@xuegod63 ~]# mysqladmin -u root -p
42.7.2 set password
mysql> set password for mka@"localhost" = password('456789');
mysql> FLUSH PRIVILEGES;
重置 mysql root 密碼
方法一:
[root@xuegod63 mysql]# /etc/init.d/mysqld stop
[root@xuegod63 mysql]# mysqld_safe --skip-grant-tables --skip-networking
在另一個終端打開:
mysql> update mysql.user set password=password('1234567') where host=' localhost' and
user='root';
[root@xuegod63 aa]# /etc/init.d/mysqld restart
本節(jié)課的考題:
1、 刪除了所有用戶怎么辦
mysql> delete from mysql.user; 刪除所有用戶
mysql> flush privileges;
沒有用戶可以登錄
解決辦法:service mysqld stop
mysqld_safe --skip-grant-tables --skip-networking
另外終端
Mysql
mysql> insert into mysql.user (host, user, password) values ('localhost', 'root',
password('123456'));
mysql> flush privileges;
mysql> grant all privileges on *.* to 'root'@'localhost';
/etc/init.d/mysqld restart
或者
Mysql 登陸后
mysql> flush privileges; 先刷新表,一定要先刷新
不能出現(xiàn)這個錯誤:
mysql> grant all privileges on *.* to system@localhost identified by '123456' with grant option;
mysql> flush privileges;
/etc/init.d/mysqld restart
mysql -usystem -p123456
mysql 日常維護工具:
開始之前,把 xuegod63 和 xuegod64 都恢復:
[root@xuegod63 ~]# yum install mysql-server -y
[root@xuegod63 ~]# service mysqld restart
上傳 book.sql 到 xuegod63,然后導入數(shù)據(jù)庫
[root@xuegod63 ~]# mysqlmysql> create database book;
[root@xuegod63 ~]# mysql -uroot -p book < book.sql
Enter password:
[root@xuegod63 ~]# mysqladmin -u root password "123456"
mysql 修復工具 mysqlcheck
什么時候用這個工具?
舉例:
數(shù)據(jù)庫服務器(mysql)因機房掉電,異常關機。等服務器重新起來,啟動mysql服務后,發(fā)現(xiàn)部分表有所損壞。報can't open file: "xxxx.MYI"(errno: 145)
mysqlcheck使用
mysqlcheck客戶端工具可以檢查和修復MyISAM表,還可以優(yōu)化和分析表。
實際上,它集成了mysql工具中check、repair、analyze、optimize的功能。
analyze[英]['?n?la?z] 分析
optimize[英][??pt?ma?z] 優(yōu)化
/usr/local/mysql/bin/mysqlcheck #源碼編譯安裝位置
rpm -qf which mysqlcheck
yum 安裝查看
參數(shù)選項
option中有以下常用選項:
-c, --check (檢查表);
-r, --repair(修復表);
-a, --analyze (分析表);
-o, --optimize(優(yōu)化表); //其中,默認選項是-c(檢查表)
-u, 使用 mysql 中哪個用戶進行操作
mysqlcheck 語法:
使用以下3種方式來調(diào)用mysqlcheck:
mysqlcheck[options] db_name [tables]
mysqlcheck[options] ---database DB1 [DB2 DB3...]
mysqlcheck[options] --all--database如果沒有指定任何表或使用---database或--all--database選項,則檢查整個數(shù)據(jù)庫。
例:
[root@xuegod63 ~]# rpm -qf which mysqlcheck
mysql-5.1.71-1.el6.x86_64
檢查表(check);
[root@xuegod63 ~]# mysqlcheck -u root -p123456 -c book books
book.books OK
修復表(repair);
[root@xuegod63 ~]# mysqlcheck -u root -p123456 -c book books
book.books OK
修復指定的數(shù)據(jù)庫
[root@xuegod63 ~]# mysqlcheck -uroot -p -r --database book
Enter password:
book.books OK
book.category OK
參數(shù):
-B, --databases Check several databases
檢查修復所有的數(shù)據(jù)庫
[root@xuegod63 ~]# mysqlcheck -u root -A -r -p
Enter password:
book.books OK
book.category OK
mysql.columns_priv OK
參數(shù)-A 等于 --all-databases
實戰(zhàn)1:每天定時自動優(yōu)化MySQL數(shù)據(jù)庫
[root@xuegod63 ~]# crontab -e //把它加入 cron job 每天在 01:00 自動執(zhí)行
[root@xuegod63 ~]#
0 1 * * * mysqlcheck -A -o -r -u你的用戶名 -p你的密碼 > /dev/null 2>&10 3 * * * mysqlcheck -uroot -p123456 -r -o -A > /dev/null 2>&1
mysql備份與恢復:
按照備份時對數(shù)據(jù)庫的影響范圍,備份的方法
Hot backup(熱備) Cold Backup(冷備) Warm Backup(溫備)
Hot backup:指在數(shù)據(jù)庫運行中直接備份,對正在運行的數(shù)據(jù)庫沒有任何影響。(Online Backup)官方手冊為在線備份
Cold Backup:指在數(shù)據(jù)庫停止的情況下進行備份(OfflineBackup) 官方手冊稱為離線備份
Warm Backup:備份同樣在數(shù)據(jù)庫運行時進行,但是會對當前數(shù)據(jù)庫的操作有所影響,例如加一個全局讀鎖以保證備份數(shù)據(jù)的一致性
按照備份后文件內(nèi)容:
邏輯備份-->
指備份后的文件內(nèi)容是可讀的,通常為文本文件,內(nèi)容一般是SQL語句,或者是表內(nèi)的實際數(shù)據(jù),如
mysqldump和SELECT * INTO OUTFILE的方法,一般適用于數(shù)據(jù)庫的升級和遷移,恢復時間較長
裸文件備份-->
拷貝數(shù)據(jù)庫的物理文件,數(shù)據(jù)庫既可以處于運行狀態(tài)(mysqlhotcopy 、ibbackup、xtrabackup這類工具),也可以處于停止狀態(tài),恢復時間較短。
按照備份數(shù)據(jù)庫的內(nèi)容來分,又可以分為:
完全備份:對數(shù)據(jù)庫完整的備份
增量備份:在上一次完全備份基礎上,對更新的數(shù)據(jù)進行備份(xtrbackup)
日志備份:二進制日志備份,主從復制邏輯備份工具:mysqldump
使用的時候MySQL當要導入或者導出數(shù)據(jù)量大的庫的時候,用PHPMYADMIN甚至MySQL Administrator 這些工具都會力不從心,這時只能使用 MySQL 所提供的命令行工具 mysqldump 進行備份恢復。數(shù)據(jù)量大的時候不推薦使用,可支持 MyISAM,InnoDB
MySQL 數(shù)據(jù)的導出和導入工具:mysqldump。
導出數(shù)據(jù):
語法: mysqldump [OPTIONS] database [tables] >導出的文件名.sql
例:1.導出整個 book 數(shù)據(jù)庫
mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 > 導出的文件名.sql # 注意是-p 空格后是數(shù)據(jù)庫名,不是密碼。
[root@xuegod63 ~]# mysqldump -u root -p book > /opt/book.sql
或:
[root@xuegod63 mysql]# mysqldump -u root -p123456 book > /opt/book.sql
查看內(nèi)容:
[root@xuegod63 mysql]# vim /opt/book.sql
例:2.導入數(shù)據(jù)庫
法一:
[root@xuegod63 ~]# mysql -u root -p book < /opt/book.sql
Enter password: 輸入密碼即可。
如果導入時,沒有對應的數(shù)據(jù)庫,需要你手動創(chuàng)建一下:
mysql> create database book;
方法二:使用source 命令導入數(shù)據(jù)
如mysql -u root -p
mysql>use 數(shù)據(jù)庫
然后使用source命令,后面參數(shù)為腳本文件(如這里用到的.sql)
mysql> drop table books; #刪除數(shù)據(jù),再導入數(shù)據(jù)
mysql> source /opt/book.sql ;
。。。
Query OK, 44 rows affected (0.00 sec) #查詢行,44 行的影響(0 秒)Records: 44 Duplicates: 0 Warnings: 0 #記錄:44 份:0 警告:0
。。。
Duplicates ?dju:pl?ke?t 重復的
mysql> create database book;
mysql -usystem -p123456 book
mysql -usystem -p123456 book
c:導入表
mysql> drop table books;
mysql> source /root/books.sql; ##導入表時,不需要重新,創(chuàng)建表。
mysql> select * from books;
D:導入表結構和數(shù)據(jù)
mysql> create database book;
mysql -usystem -p123456 book
mysql -usystem -p123456 book
例:導出單張表:
[root@xuegod63 mysql]# mysqldump -u root -p123456 book books > books.sql
導入book庫中的books表。
導入:
mysql> drop table books;
mysql> source /root/books.sql; ##導入表時,不需要重新,創(chuàng)建表。
mysql> select * from books;
例:導出所有數(shù)據(jù)庫:
[root@xuegod63 ~]# mysqldump -u root -p123456 -A > all1.sql
[root@xuegod63 ~]# mysqldump -u root -p123456 --all-databases > all2.sql
或:
參數(shù):-A, --all-databases Dump all the databases.
[root@xuegod63 /]# vim all.sql #查看sql語句,導入數(shù)據(jù)時,會自動創(chuàng)建對應的數(shù)據(jù)庫導入:
[root@xuegod63 /]# mysql -u root -p123456 < all.sql
D:導出庫的表結構
mysqldump -usystem -p123456 -d book>booktable.sql #只導出 book 庫的表結構
E:只導出數(shù)據(jù)
mysqldump -usystem -p123456 -t book>bookdata.sql #只導出 book 庫中的數(shù)據(jù)
F:導出數(shù)據(jù)庫,并自動生成庫的創(chuàng)建語句
mysqldump -uroot -p123456 -B book2 >book2.sql
mysql -uroot -p123456 < book2.sql 導入不用指定數(shù)據(jù)名