权限
在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然后连接进行操作,主要的操作就是数据的crud
目的:创建一个用户并且给用户设置权限和密码。
grant 权限 on 数据库.表名 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'
超出权限报错:
ERROR 1142 (42000): UPDATE command denied to user 'zhangsan'@'localhost' for table 'usersinfo'
用户拥有某个表的所有权限
grant all privileges on class1804.usersinfo to '用户名'@'主机ip' identified by '密码'
用户拥有某个数据库下所有表的所有权限
grant all privileges on class1804.* to '用户名'@'主机ip' identified by '密码'
用户拥有某个数据库下所有表的可读(查找)
grant select on class1804.* to '用户名'@'主机ip' identified by '密码'
在哪里查看创建的用户
客户端登录后在mysql这个数据库下有一个user表
select user,host,auth....._string from user;
第二中方式创建用户给用户设置权限
1.先创建用户,在设置权限
create user '用户名'@'ip' identified by '密码'
再高版本下mysql的版本为8.0.10以上密码是有安全要求的(必须是8位,由大写字母,小写字母、
数字、特殊字符)
2.再设置权限
grant 权限 on 数据库.表 to '用户名'@'%';
mysql -h127.0.0.1 -u ldd -p
先创建一个用户
CREATE USER 'ldd'@'127.0.0.1' identified by 'Abcd123*';
设置权限
GRANT ALL PRIVILEGES on *.* to 'ldd'@'127.0.0.1';
刷新权限
flush privileges;
查看权限
SHOW GRANTS for 'ldd'@'127.0.0.1';
精确到某个表:on 数据库.表名
精确到某个数据库:on 数据库.*
拥有所用mysql下所有数据库的所有表:on *.*
要设置所有权限:grant all privileges on *.* to 'user'@'ip' identified by 'mima'
删除某一个用户
drop user 'ldd'@'127.0.0.1';
重新给用户命名
RENAME user 'zhangsan'@'%' to 'zhangsanfeng'@'%';
撤销权限
REVOKE SELECT ON class1804.usersinfo from 'zhangsanfeng'@'%';
MySQL所拥有的权限
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
在操作结束之后需要刷新权限
flush privileges
数据库的备份与还原
数据库的备份
mysqldump -u 用户名 -p 数据库 表 > 备份路径
此命令会执行一系列的行为:
先删除 -> 在创建 -> 然后上锁 -> 然后解锁
恢复数据
mysql -u 用户名 -p 数据库 (不需要指定表名) < 备份路径
备份整个数据库(会把数据库中的所有的表以及数据都备份)
mysqldump -u root -p 数据库名 > 指定备份数据的路径
恢复(注意:如果要备份的是数据库,这个时候先创建数据库,然后才能完成备份)
mysql -u root -p 数据库名 < 备份路径
一次备份多个数据库
mysqldump -u root -p 数据库名 数据库名 ... >备份路径
#备份所有的数据库
mysqldump -u 用户名 -p --all-databases --lock-all-tables > 备份路径
--all-databases :导出所有数据库
--lock-all-tables :执行操作时锁住所有表,防止操作时有数据修改
~/桌面/master_db.sql :导出的备份数据(sql文件)位置,可自己指定
假如要恢复所有的数据库,这个时候不需要自己在一个一个创建数据库,我们在恢复的时候,会自动创建
mysql -u 用户名 -p < 备份路径
只备份结构不备份数据 -d
mysqldump -u root -p -d 数据库名 > 备份路径
mysql 如何与python交互
使用pymysql模块,实现Python与MySQL的交互。
:param host: (连接数据库的时候设置的ip)
:param user: (登录的用户名)
:param password: (登录的密码)
:param database: (设置你要操作的数据库)
:param port: 3306 (设置端口号)
:param charset: Charset you want to use.(设置你想使用的字符集)
以上内容可以写在一行并且前三个位置默认为IP、用户名、密码,可以写成如下模式。
mysqlconn=pymysql.connect('localhost','root','123',database='class1804',charset='utf8')
然后我们需要创建一个游标:
#cursor_handler = mysqlconn.cursor()
之后我们就可以通过input来验证输入的内容的真实性。
然后通过字符串赋值变量,将字符串的内容去验证输入的内容:
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)"""
然后在执行语句的时候再赋值
cursor.execute(sql,(id,teacher_name))
然后提交数据即可
mysqlconn.commit()
设置pymysql.cursors.DictCursor将对应的行的数据以字典的形式返回,如果是多个直接放在一个列表中
conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor_handler.lastrowid 返回最后插入数据的id