mysql刪除root用戶的方法:1、使用“CREATE USER”語句創建一個與root用戶權限一樣的用戶;2、使用“drop user”語句刪除root用戶,語法“DROP USER root用戶賬號”。
本教程操作環境:windows7系統、mysql8版本、Dell G3電腦。
刪除MySQL的默認root用戶
需求分析:
-
root密碼在多個地方出現過,比如分享的技術文檔,郵件,截圖.
-
MySQL默認安裝的管理員帳號名稱root,眾所周知.為了增強安全性,需要更換一個用戶名稱,例如換成superuser,或者有公司特色的.例如xxx_admin.
應對策略:
-
首先創建一個與root用戶權限一樣的用戶.
GRANT?ALL?PRIVILEGES?ON?*.*?TO?'x_admin'@'127.0.0.1'?IDENTIFIED?BY?'xxxx';
-
刪除默認的root用戶.
drop?user?root@'127.0.0.1'; drop?user?root@'localhost'; drop?user?root@'::1';
用戶賬號:
格式為?user_name’@’host_name。
這里的user_name是用戶名,host_name為主機名,即用戶連接 MySQL 時所用主機的名字。
如果在創建的過程中,只給出了用戶名,而沒指定主機名,那么主機名默認為“%”,表示一組主機,即對所有主機開放權限。
注意問題:
1、視圖
曾經用root帳號為DEFINER的視圖,如果將root刪除,將提示該視圖無法使用,沒有權限.所以要注意提前查看是否存在視圖,存在的話,需要修改該視圖的DEFINER屬性.
修改視圖,是瞬間就能完成的操作,除非該視圖被其他sql語句占用,處于鎖定的狀態.
查看視圖
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、存儲過程/函數
情況與視圖類似
查看存儲過程/視圖
select?ROUTINE_SCHEMA,ROUTINE_NAME,ROUTINE_TYPE,DEFINER?from?information_schema.ROUTINES;
或者
select?db,name,type,definer?from?mysql.proc;
修改存儲例程,可直接修改mysql.proc
update?mysql.proc?set?definer='x_admin@127.0.0.1'where?db='db_name';
如果修改所有庫
update?mysql.proc?set?definer='x_admin@127.0.0.1';
2、用root用戶連接MySQL的腳本
此類問題比較好解決,可單獨為腳本創建帳號用來執行腳本中指定的操作,該用戶名可用script_,或者腳本名命名.權限夠用就行,不要分配過多的權限.
4、方法:一個增加用戶的腳本.(配合批量執行)
#!/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()
【相關推薦:mysql視頻教程】