1.mysql用户管理 *** 数据安全非常重要 不可能随便分配root账户 应该按照不同开发岗位分配不同的账户和权限 mysql中 将于用户相关的数据放在mysql库 user - > db - > tables_priv -> columns_priv 如果用户拥有对所有库的访问权 则存储在 user中 如果用户拥有对部分库的使用权 db 如果用户拥有对部分表的使用权 tables; 如果用户拥有对表中某些字段的使用权 columns_priv中 创建新账户 create user "账户名"@"主机名" identified by 密码 create user "tom"@"localhost" identified by "123"; 授予所有数据库所有表的所有权限给jerry这个用户 并允许jerry在任意一台电脑登录 如果用户不存在会自动创建 grant all on *.* to "jerry"@"%" identified by "123" with grant option; with grant option这个用户可以将拥有的权限授予别人 授予day45数据库所有表的所有权限给jack这个用户 并允许jerry在任意一台电脑登录 grant all on day45.* to "jack"@"%" identified by "123"; 授予day45数据库的emp表的所有权限给rose这个用户 并允许jerry在任意一台电脑登录 grant all on day45.emp to "rose"@"%" identified by "123"; 授予day45数据库的emp表的name字段的查询权限给maria这个用户 并允许jerry在任意一台电脑登录 grant select(name) on day45.emp to "maria"@"%" identified by "123"; 收回权限 REVOKE all privileges [column] on db.table from user@"host"; 如何授权就如何收回 因为不同权限信息存到不同的表中 REVOKE all privileges on day45.emp from maria@"%"; 立即刷新权限信息 flush privileges; # 删除用户 drop user 用户名@主机 drop user maria@% 当你在云服务器部署了 mysql环境时 你的程序无法直接连接到服务器 需要授予在任意一台电脑登录的权限 grant all on *.* to "jerry"@"%" identified by "123" with grant option; MySQL数据备份 1 使用mysqldump实现逻辑备份 #语法: # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql #示例: #单库备份 mysqldump -uroot -p123 db1 > db1.sql mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql #多库备份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql #备份所有库 mysqldump -uroot -p123 --all-databases > all.sql 2 恢复逻辑备份 #方法一: [root@egon backup]# mysql -uroot -p123 < /backup/all.sql #方法二: mysql> use db1; mysql> SET SQL_LOG_BIN=0; mysql> source /root/db1.sql #注:如果备份/恢复单个库时,可以修改sql文件 DROP database if exists school; create database school; use school; 2.pymysql **** 后期开发中都是用框架代替pymysql 为什么使用pymysql 因为我们需要在程序去连接数据库进行增删改查 import pymysql conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", password="123", database="1123test", charset="utf8" ) # cursor 游标对象 负责执行sql语句 获取返回的数据 # pymysql.cursors.DictCursor指定使用字典类型的游标 默认是元祖类型 cursor = conn.cursor(pymysql.cursors.DictCursor) sql = "select *from book" # 返回值是本次查询的记录条数 res = cursor.execute(sql) #执行sql # print(res) # print(cursor.fetchall()) # 提取所有结果 print(cursor.fetchone()) print(cursor.fetchone()) # cursor.scroll(1,mode="absolute") # 游标从开始位置往后移动1条记录 cursor.scroll(1,mode="relative") # 游标从当前位置往后移动1条记录 print(cursor.fetchone()) # 提取一条记录 # print(cursor.fetchone()) # print(cursor.fetchone()) # print(cursor.fetchmany(2)) # 提取指定数量记录 3. sql注入共计 注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符 根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha, 用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha' # 什么是sql注入攻击 一些了解sql语法的攻击者 可以通过一些特殊符号 来修改 sql执行逻辑 达到绕过验证的效果 # 避免的方式 1.在输入时加上正则判断 不允许输入与sql相关的关键字 这种方式 无法避免 代理服务器发起的攻击 2.在服务器端 执行sql前先来一波判断 # pymysql中已经帮你做了处理 只要将参数的拼接交给pymysql来完成就能够避免攻击 import pymysql conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", password="123", database="1123test", charset="utf8" ) # cursor 游标对象 负责执行sql语句 获取返回的数据 # pymysql.cursors.DictCursor指定使用字典类型的游标 默认是元祖类型 cursor = conn.cursor(pymysql.cursors.DictCursor) author = input("输入author:") page = input("输入page:") sql = "select *from book where author = '%s' and page = '%s'" %(author,page) # sql = "select *from book where author = %s and page = %s" print(sql) res = cursor.execute(sql) # res = cursor.execute(sql,(author,page)) if res: print("登录成功") else: print("登录失败") 4.mysql 增删改 import pymysql conn = pymysql.connect( host="127.0.0.1", port=3306, user="root", password="root", database="day47", charset="utf8" ) # cursor 游标对象 负责执行sql语句 获取返回的数据 # pymysql.cursors.DictCursor指定使用字典类型的游标 默认是元祖类型 cursor = conn.cursor(pymysql.cursors.DictCursor) # sql = "insert into user values(null,'中狗子','123')" sql = "update user set name = '小黄' where name = '中狗子'" # sql = "delete from user where name = '大狗子'" res = cursor.execute(sql) # pymysql不会自动提交 对数据的修改不会持久化 需要手动commit conn.commit() print(res) 3.可视化工具navicat ***** # 什么阶段使用可视化 # 项目开始前 就应该先设计数据库 如果表很多 就需要使用可视化 # 最好的功能是ER图 可以直观看出 表与表的关系 掌握: #1. 测试+链接数据库 #2. 新建库 #3. 新建表,新增字段+类型+约束 #4. 设计表:外键 #5. 新建查询 #6. 备份库/表 #注意: 批量加注释:ctrl+?键 批量去注释:ctrl+shift+?键