權(quán)限
在生產(chǎn)環(huán)境下操作數(shù)據(jù)庫時,絕對不可以使用root賬戶連接,而是創(chuàng)建特定的賬戶,授予這個賬戶特定的操作權(quán)限,然后連接進行操作,主要的操作就是數(shù)據(jù)的crud?
目的:創(chuàng)建一個用戶并且給用戶設(shè)置權(quán)限和密碼。
grant 權(quán)限 on 數(shù)據(jù)庫.表名 to '用戶名'@'主機ip' identified by '密碼'
grant select on class1804.usersinfo to 'zhangsan'@'%' identified by '123456'
grant select,delete,alter,... on class1804.usersinfo to 'zhangsan'@'%' identified by '123456'
超出權(quán)限報錯:
ERROR 1142 (42000): UPDATE command denied to user 'zhangsan'@'localhost' for table 'usersinfo'
用戶擁有某個表的所有權(quán)限
grant all privileges on class1804.usersinfo to '用戶名'@'主機ip' identified by '密碼'
用戶擁有某個數(shù)據(jù)庫下所有表的所有權(quán)限
grant all privileges on class1804.* to '用戶名'@'主機ip' identified by '密碼'
用戶擁有某個數(shù)據(jù)庫下所有表的可讀(查找)
grant select on class1804.* to '用戶名'@'主機ip' identified by '密碼'
在哪里查看創(chuàng)建的用戶
客戶端登錄后在mysql這個數(shù)據(jù)庫下有一個user表
select user,host,auth....._string from user;
第二中方式創(chuàng)建用戶給用戶設(shè)置權(quán)限
1.先創(chuàng)建用戶,在設(shè)置權(quán)限
create user '用戶名'@'ip' identified by '密碼'
再高版本下mysql的版本為8.0.10以上密碼是有安全要求的(必須是8位,由大寫字母,小寫字母、
數(shù)字、特殊字符)
2.再設(shè)置權(quán)限
grant 權(quán)限 on 數(shù)據(jù)庫.表 to '用戶名'@'%';
mysql -h127.0.0.1? -u ldd -p
先創(chuàng)建一個用戶
CREATE USER 'ldd'@'127.0.0.1' identified by 'Abcd123*';
設(shè)置權(quán)限
GRANT ALL PRIVILEGES on *.* to 'ldd'@'127.0.0.1';
刷新權(quán)限
?flush privileges;
查看權(quán)限
?SHOW GRANTS for 'ldd'@'127.0.0.1';
精確到某個表:on 數(shù)據(jù)庫.表名
精確到某個數(shù)據(jù)庫:on 數(shù)據(jù)庫.*
擁有所用mysql下所有數(shù)據(jù)庫的所有表:on *.*
要設(shè)置所有權(quán)限:grant all privileges on *.* to 'user'@'ip' identified by 'mima'
刪除某一個用戶
drop user 'ldd'@'127.0.0.1';
重新給用戶命名
RENAME user 'zhangsan'@'%' to 'zhangsanfeng'@'%';
撤銷權(quán)限
REVOKE SELECT ON class1804.usersinfo from 'zhangsanfeng'@'%';
MySQL所擁有的權(quán)限
INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER,SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE
在操作結(jié)束之后需要刷新權(quán)限
flush privileges
數(shù)據(jù)庫的備份與還原
數(shù)據(jù)庫的備份
mysqldump -u 用戶名 -p 數(shù)據(jù)庫 表 > 備份路徑
此命令會執(zhí)行一系列的行為:
先刪除 ->? 在創(chuàng)建 -> 然后上鎖 ->? 然后解鎖
恢復(fù)數(shù)據(jù)
mysql -u 用戶名 -p 數(shù)據(jù)庫?(不需要指定表名)?< 備份路徑
備份整個數(shù)據(jù)庫(會把數(shù)據(jù)庫中的所有的表以及數(shù)據(jù)都備份)
mysqldump -u root -p 數(shù)據(jù)庫名 > 指定備份數(shù)據(jù)的路徑
恢復(fù)(注意:如果要備份的是數(shù)據(jù)庫,這個時候先創(chuàng)建數(shù)據(jù)庫,然后才能完成備份)
mysql -u root -p 數(shù)據(jù)庫名 < 備份路徑
一次備份多個數(shù)據(jù)庫
mysqldump -u root -p 數(shù)據(jù)庫名 數(shù)據(jù)庫名 ... >備份路徑
#備份所有的數(shù)據(jù)庫
mysqldump -u 用戶名 -p --all-databases --lock-all-tables > 備份路徑
--all-databases :導(dǎo)出所有數(shù)據(jù)庫
--lock-all-tables :執(zhí)行操作時鎖住所有表,防止操作時有數(shù)據(jù)修改
~/桌面/master_db.sql :導(dǎo)出的備份數(shù)據(jù)(sql文件)位置,可自己指定
假如要恢復(fù)所有的數(shù)據(jù)庫,這個時候不需要自己在一個一個創(chuàng)建數(shù)據(jù)庫,我們在恢復(fù)的時候,會自動創(chuàng)建
mysql -u 用戶名 -p < 備份路徑
只備份結(jié)構(gòu)不備份數(shù)據(jù) -d
mysqldump -u root -p -d 數(shù)據(jù)庫名 > 備份路徑
mysql 如何與python交互
使用pymysql模塊,實現(xiàn)Python與MySQL的交互。
:param host: (連接數(shù)據(jù)庫的時候設(shè)置的ip)
:param user: (登錄的用戶名)
:param password: (登錄的密碼)
?:param database: (設(shè)置你要操作的數(shù)據(jù)庫)
:param port:? 3306?。ㄔO(shè)置端口號)
:param charset: Charset you want to use.(設(shè)置你想使用的字符集)
以上內(nèi)容可以寫在一行并且前三個位置默認為IP、用戶名、密碼,可以寫成如下模式。
mysqlconn=pymysql.connect('localhost','root','123',database='class1804',charset='utf8')
然后我們需要創(chuàng)建一個游標:
#cursor_handler = mysqlconn.cursor()
之后我們就可以通過input來驗證輸入的內(nèi)容的真實性。
然后通過字符串賦值變量,將字符串的內(nèi)容去驗證輸入的內(nèi)容:
sql = """ INSERT INTO teachers(id,name) VALUES ('%s','%s') """ % (id,name)
這里有兩個問題:
1.使用占位符的時候只有%s,并不像Python的占位符一樣有%d、%s之類的。
2.sql注入:
以上的寫法會使賬號不安全,別人可以通過sql注入來登錄你的賬號,盜取你的信息。
要寫成如下
sql = """INSERT INTO teachers(id,name) VALUES(%s,%s)"""
然后在執(zhí)行語句的時候再賦值
cursor.execute(sql,(id,teacher_name))
然后提交數(shù)據(jù)即可
mysqlconn.commit()
設(shè)置pymysql.cursors.DictCursor將對應(yīng)的行的數(shù)據(jù)以字典的形式返回,如果是多個直接放在一個列表中
conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor_handler.lastrowid 返回最后插入數(shù)據(jù)的id