mysql數(shù)據(jù)庫(kù)的超級(jí)管理員名稱是“root”。MySQL在安裝時(shí),會(huì)默認(rèn)創(chuàng)建一個(gè)名為root的用戶,該用戶擁有超級(jí)權(quán)限,可以控制整個(gè)MySQL服務(wù)器。root用戶擁有很高的權(quán)限,不僅可以修改自己的密碼,還可以修改其他用戶的密碼。
本教程操作環(huán)境:windows7系統(tǒng)、java8版、DELL G3電腦。
mysql數(shù)據(jù)庫(kù)的超級(jí)管理員名稱是“root”。
MySQL 在安裝時(shí),會(huì)默認(rèn)創(chuàng)建一個(gè)名為 root 的用戶,該用戶擁有超級(jí)權(quán)限,可以控制整個(gè) MySQL 服務(wù)器。
在對(duì) MySQL 的日常管理和操作中,為了避免有人惡意使用 root 用戶控制數(shù)據(jù)庫(kù),我們通常創(chuàng)建一些具有適當(dāng)權(quán)限的用戶,盡可能地不用或少用 root 用戶登錄系統(tǒng),以此來(lái)確保數(shù)據(jù)的安全訪問(wèn)。
一般root超級(jí)管理員的權(quán)限會(huì)比一般用戶的權(quán)限大很多,所以有些操作要root權(quán)限才能運(yùn)行。
root 用戶擁有很高的權(quán)限,不僅可以修改自己的密碼,還可以修改其他用戶的密碼。
MySQL修改root密碼
在 MySQL 中,root 用戶擁有很高的權(quán)限,因此必須保證 root 用戶密碼的安全。修改 root 用戶密碼的方式有很多種,本節(jié)將介紹幾種常用的修改 root 用戶密碼的方法。
-
修改MySQL數(shù)據(jù)庫(kù)的user表
因?yàn)樗匈~戶信息都保存在 user 表中,因此可以直接通過(guò)修改 user 表來(lái)改變 root 用戶的密碼。
root 用戶登錄到 MySQL 服務(wù)器后,可以使用 UPDATE 語(yǔ)句修改 MySQL 數(shù)據(jù)庫(kù)的 user 表的 authentication_string 字段,從而修改用戶的密碼。
使用 UPDATA 語(yǔ)句修改 root 用戶密碼的語(yǔ)法格式如下:
UPDATE mysql.user set authentication_string = PASSWORD ("rootpwd) WHERE User = "root" and Host="localhost";
新密碼必須使用 PASSWORD() 函數(shù)來(lái)加密。執(zhí)行UPDATE語(yǔ)句后,需要執(zhí)行FLUSH PRIVILEGES語(yǔ)句重新加載用戶權(quán)限。
-
使用SET語(yǔ)句修改root用戶的密碼
SET PASSWORD 語(yǔ)句可以用來(lái)重新設(shè)置其他用戶的登錄密碼或者自己使用的賬戶的密碼。使用 SET 語(yǔ)句修改密碼的語(yǔ)法結(jié)構(gòu)如下:
SET PASSWORD = PASSWORD ("rootpwd");
MySQL root修改普通用戶密碼
-
使用SET語(yǔ)句修改普通用戶的密碼
在 MySQL 中,只有 root 用戶可以通過(guò)更新 MySQL 數(shù)據(jù)庫(kù)來(lái)更改密碼。使用 root 用戶登錄到 MySQL 服務(wù)器后,可以使用 SET 語(yǔ)句來(lái)修改普通用戶密碼。語(yǔ)法格式如下:
SET PASSWORD FOR 'username'@'hostname' = PASSWORD ('newpwd');
其中,username 參數(shù)是普通用戶的用戶名,hostname 參數(shù)是普通用戶的主機(jī)名,newpwd 是要更改的新密碼。
注意:新密碼必須使用 PASSWORD() 函數(shù)來(lái)加密,如果不使用 PASSWORD() 加密,也會(huì)執(zhí)行成功,但是用戶會(huì)無(wú)法登錄。
如果是普通用戶修改密碼,可省略 FOR 子句來(lái)更改自己的密碼。語(yǔ)法格式如下:
SET PASSWORD = PASSWORD('newpwd');
示例 1
root 用戶登錄 MySQL 服務(wù)器后,再使用 SET 語(yǔ)句將 testuser 用戶的密碼修改為“newpwd”,SQL 語(yǔ)句和運(yùn)行結(jié)果如下:
mysql> SET PASSWORD FOR 'testuser'@'localhost' = PASSWORD("newpwd"); Query OK, 0 rows affected, 1 warning (0.01 sec)
由運(yùn)行結(jié)果可以看出,SET 語(yǔ)句執(zhí)行成功,testuser 用戶的密碼被成功設(shè)置為“newpwd”。
-
使用UPDATE語(yǔ)句修改普通用戶的密碼
使用 root 用戶登錄 MySQL 服務(wù)器后,可以使用 UPDATE 語(yǔ)句修改 MySQL 數(shù)據(jù)庫(kù)的 user 表的 authentication_string 字段,從而修改普通用戶的密碼。UPDATA 語(yǔ)句的語(yǔ)法如下:
UPDATE MySQL.user SET authentication_string = PASSWORD("newpwd") WHERE User = "username" AND Host = "hostname";
其中,username 參數(shù)是普通用戶的用戶名,hostname 參數(shù)是普通用戶的主機(jī)名,newpwd 是要更改的新密碼。
注意,執(zhí)行 UPDATE 語(yǔ)句后,需要執(zhí)行 FLUSH PRIVILEGES 語(yǔ)句重新加載用戶權(quán)限。
示例 3
使用 root 用戶登錄 MySQL 服務(wù)器,再使用 UPDATE 語(yǔ)句將 testuser 用戶的密碼修改為“newpwd2”的 SQL 語(yǔ)句和運(yùn)行結(jié)果如下:
mysql> UPDATE MySQL.user SET authentication_string = PASSWORD ("newpwd2") -> WHERE User = "testuser" AND Host = "localhost"; Query OK, 1 row affected, 1 warning (0.07 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.03 sec)
由運(yùn)行結(jié)果可以看出,密碼修改成功。testuser 的密碼被修改成了 newpwd2。使用 FLUSH PRIVILEGES 重新加載權(quán)限后,就可以使用新的密碼登錄 testuser 用戶了。
刪除MySQL的默認(rèn)root用戶
需求分析:
-
root密碼在多個(gè)地方出現(xiàn)過(guò),比如分享的技術(shù)文檔,郵件,截圖.
-
MySQL默認(rèn)安裝的管理員帳號(hào)名稱root,眾所周知.為了增強(qiáng)安全性,需要更換一個(gè)用戶名稱,例如換成superuser,或者有公司特色的.例如xxx_admin.
應(yīng)對(duì)策略:
-
首先創(chuàng)建一個(gè)與root用戶權(quán)限一樣的用戶.
GRANT ALL PRIVILEGES ON *.* TO 'x_admin'@'127.0.0.1' IDENTIFIED BY 'xxxx';
-
刪除默認(rèn)的root用戶.
drop user root@'127.0.0.1'; drop user root@'localhost'; drop user root@'::1';
用戶賬號(hào):
格式為 user_name'@'host_name。
這里的user_name是用戶名,host_name為主機(jī)名,即用戶連接 MySQL 時(shí)所用主機(jī)的名字。
如果在創(chuàng)建的過(guò)程中,只給出了用戶名,而沒指定主機(jī)名,那么主機(jī)名默認(rèn)為“%”,表示一組主機(jī),即對(duì)所有主機(jī)開放權(quán)限。
注意問(wèn)題:
1、視圖
曾經(jīng)用root帳號(hào)為DEFINER的視圖,如果將root刪除,將提示該視圖無(wú)法使用,沒有權(quán)限.所以要注意提前查看是否存在視圖,存在的話,需要修改該視圖的DEFINER屬性.
修改視圖,是瞬間就能完成的操作,除非該視圖被其他sql語(yǔ)句占用,處于鎖定的狀態(tài).
查看視圖
select TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION, DEFINER from information_schema.VIEWS;
修改視圖(非root的暫不修改)
ALTER DEFINER=`x_admin`@`127.0.0.1` SQL SECURITY DEFINER VIEW v_name AS...
2、存儲(chǔ)過(guò)程/函數(shù)
情況與視圖類似
查看存儲(chǔ)過(guò)程/視圖
select ROUTINE_SCHEMA,ROUTINE_NAME,ROUTINE_TYPE,DEFINER from information_schema.ROUTINES;
或者
select db,name,type,definer from mysql.proc;
修改存儲(chǔ)例程,可直接修改mysql.proc
update mysql.proc set definer='x_admin@127.0.0.1'where db='db_name';
如果修改所有庫(kù)
update mysql.proc set definer='x_admin@127.0.0.1';
2、用root用戶連接MySQL的腳本
此類問(wèn)題比較好解決,可單獨(dú)為腳本創(chuàng)建帳號(hào)用來(lái)執(zhí)行腳本中指定的操作,該用戶名可用script_,或者腳本名命名.權(quán)限夠用就行,不要分配過(guò)多的權(quán)限.
4、方法:一個(gè)增加用戶的腳本.(配合批量執(zhí)行)
#!/usr/bin/python #-*- coding: UTF-8 -*- # ######################################################################## # This program # Version: 2.0.0 (2012-10-10) # Authors: lianjie.ning@qunar.com # History: # ######################################################################## import os import socket import subprocess import sys import traceback from ConfigParser import ConfigParser class Finger(object): 'finger.py' def __init__ (self): print '---- %s, %s' % (socket.gethostname(), self.__doc__) def load_config (self, file="finger.ini"): if not os.path.exists(file): print file,"is not exists, but is created, please fix it" temp_ini = '''[conn_db] login_pwd = exec_sql = ''' open(file, 'w').write(temp_ini) os.chmod(file, 0600) sys.exit() config = ConfigParser() config.read(file) if config.has_section('conn_db') is True: if config.has_option('conn_db', 'login_pwd') is True: login_pwd = config.get('conn_db', 'login_pwd') if config.has_option('conn_db', 'exec_sql') is True: exec_sql = config.get('conn_db', 'exec_sql') return (login_pwd, exec_sql) def grant_user(self, login_pwd, exec_sql): if os.path.exists('/usr/local/bin/mysql'): mysql = '/usr/local/bin/mysql' elif os.path.exists('/usr/bin/mysql'): mysql = '/usr/bin/mysql' elif os.path.exists('/bin/mysql'): mysql = '/bin/mysql' else: print "command not fount of mysql" sys.exit() user = 'xxxx' conn_port = [3306,3307,3308,3309,3310] for i in conn_port: ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) address = ('127.0.0.1', int(i)) status = ss.connect_ex(address) ss.settimeout(3) ss.close() if status == 0: conn_mysql = '%s -u%s -p%s -h127.0.0.1 -P%d -N -s -e"%s"' % (mysql, user, login_pwd, i, exec_sql) p = subprocess.call(conn_mysql, shell=True, stdout=open("/dev/null")) if p == 0: print "---- checking port: %s is NORMAL" % i else: print "---- checking prot: %s is ERROR" % i if __name__ == '__main__': try: process = Finger() (login_pwd, exec_sql) = process.load_config() process.grant_user(login_pwd, exec_sql) except Exception, e: print str(e) traceback.print_exc() sys.exit()
【