当前位置: 首页> 文旅> 文化 > 长沙正规网站建设价格_游戏开发物语完美搭配_东莞做网站推广_成都专业的整站优化

长沙正规网站建设价格_游戏开发物语完美搭配_东莞做网站推广_成都专业的整站优化

时间:2025/7/13 19:11:46来源:https://blog.csdn.net/XiaoRungen/article/details/147045010 浏览次数:0次
长沙正规网站建设价格_游戏开发物语完美搭配_东莞做网站推广_成都专业的整站优化

Python是一种强大且易于学习的编程语言。通过这个21天的计划,我们将逐步深入并发编程。无论你是初学者还是有一定基础的开发者,这个计划都将帮助你巩固和扩展你的Python知识。

在学习本篇之前,我们先复习一下前面的内容:
day1:Python下载和开发工具介绍
day2:数据类型、字符编码、文件处理
day3:基础语法与课外练习
day4:函数简单介绍
day5:模块与包
day6:常用模块介绍
day7:面向对象
day8:面向对象高级
day9:异常处理
day10:网络编程
day11:并发编程
day12:MySQL数据库初识
day13:MySQL库相关操作
day14:MySQL表相关操作
day15:MySQL中DML与权限管理

一、IDE工具介绍

生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用Navicat之类的IDE工具。

二、MySQL 数据备份

1. 备份类型

物理备份

直接复制数据库文件,这种方式适用于大型数据库环境。不过,它存在一定局限性,不能恢复到异构系统中,例如不能从 Linux 环境恢复到 Windows 环境。

逻辑备份

备份的是建表、建库、插入等操作所执行的 SQL 语句,比较适合中小型数据库。但相对物理备份,其效率较低。

导出表

将表导入到文本文件中,方便数据的存储和转移。

2. 使用 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 

3. 恢复逻辑备份

方法一
[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; 

4. 备份/恢复案例

数据库备份/恢复实验一:数据库损坏

备份步骤

1. # mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql
2. # mysql -uroot -p123 -e 'flush logs' //截断并产生新的 binlog
3. 插入数据 //模拟服务器正常运行
4. mysql> set sql_log_bin=0; //模拟服务器损坏
mysql> drop database db;

恢复步骤

1. # mysqlbinlog 最后一个 binlog > /backup/last_bin.log
2. mysql> set sql_log_bin=0; 
mysql> source /backup/2014-02-13_all.sql //恢复最近一次完全备份 
mysql> source /backup/last_bin.log //恢复最后个 binlog 文件
数据库备份/恢复实验二:如果有误删除

备份步骤

1. mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql
2. mysql -uroot -p123 -e 'flush logs' //截断并产生新的 binlog
3. 插入数据 //模拟服务器正常运行
4. drop table db1.t1 //模拟误删除
5. 插入数据 //模拟服务器正常运行

恢复步骤

1. # mysqlbinlog 最后一个 binlog --stop-position=260 > /tmp/1.sql 
# mysqlbinlog 最后一个 binlog --start-position=900 > /tmp/2.sql 
2. mysql> set sql_log_bin=0; 
mysql> source /backup/2014-02-13_all.sql //恢复最近一次完全备份
mysql> source /tmp/1.log //恢复最后个 binlog 文件
mysql> source /tmp/2.log //恢复最后个 binlog 文件

注意事项

  • 完全恢复到一个干净的环境(例如新的数据库或删除原有的数据库)。
  • 恢复期间所有 SQL 语句不应该记录到 binlog 中。

5. 实现自动化备份

备份计划
  • 时间:2:00
  • 备份数据库:可根据需求指定
  • 备份文件位置:可自定义
备份脚本
[root@xiao ~]# vim /mysql_back.sql
#!/bin/bash
back_dir=/backup
back_file=`date +%F`_all.sql
user=root
pass=123if [ ! -d /backup ];then
mkdir -p /backup
fi# 备份并截断日志
mysqldump -u${user} -p${pass} --events --all-databases > ${back_dir}/${back_file}
mysql -u${user} -p${pass} -e 'flush logs'# 只保留最近一周的备份
cd $back_dir
find . -mtime +7 -exec rm -rf {} \;
手动测试
[root@xiao ~]# chmod a+x /mysql_back.sql 
[root@xiao ~]# chattr +i /mysql_back.sql
[root@xiao ~]# /mysql_back.sql
配置 cron
[root@xiao ~]# crontab -l
2 * * * /mysql_back.sql

6. 表的导出和导入

SELECT… INTO OUTFILE 导出文本文件
mysql> SELECT * FROM school.student1
INTO OUTFILE 'student1.txt'
FIELDS TERMINATED BY ',' //定义字段分隔符
OPTIONALLY ENCLOSED BY '”' //定义字符串使用什么符号括起来
LINES TERMINATED BY '\n' ; //定义换行符
mysql 命令导出文本文件
# mysql -u root -p123 -e 'select * from student1.school' > /tmp/student1.txt
# mysql -u root -p123 --xml -e 'select * from student1.school' > /tmp/student1.xml
# mysql -u root -p123 --html -e 'select * from student1.school' > /tmp/student1.html
LOAD DATA INFILE 导入文本文件
mysql> DELETE FROM student1;
mysql> LOAD DATA INFILE '/tmp/student1.txt'
INTO TABLE school.student1
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '”'
LINES TERMINATED BY '\n';

在导出文件时可能会报错,例如:

mysql> select * from db1.emp into outfile 'C:\\db1.emp.txt' fields terminated by ',' lines terminated by '\r\n';
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable

这是因为 MySQL 为了安全考虑,对文件导出位置作了限制。需要在配置文件中设置:

[mysqld]
secure_file_priv='C:\\' #只能将数据导出到 C:\\ 下

重启 MySQL 后重新执行导出语句。

7. 数据库迁移

务必保证在相同版本之间迁移,示例命令如下:

# mysqldump -h 源 IP -uroot -p123 --databases db1 | mysql -h 目标 IP -uroot -p456

三、pymysql 模块

1. 安装

pip3 install pymysql

2. 链接、执行 sql、关闭(游标)

在这里插入图片描述

import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip()# 链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='xiao',charset='utf8')
# 游标
cursor=conn.cursor() # 执行完毕返回的结果集默认以元组显示
# cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)# 执行 sql 语句
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) # 注意 %s 需要加引号
print(sql)
res=cursor.execute(sql) # 执行 sql 语句,返回 sql 查询成功的记录数目
print(res)cursor.close()
conn.close()if res:print('登录成功')
else:print('登录失败')

3. execute() 之 sql 注入

在这里插入图片描述

最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='xiao';--之后的条件被注释掉了
#1、sql注入之:用户存在,绕过密码
xiao' -- 任意字符#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符

解决方法:

# 原来是我们对 sql 进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)# 改写为(execute 帮我们做字符串拼接,我们无需且一定不能再为 %s 加引号了)
sql="select * from userinfo where name=%s and password=%s" # !!!注意 %s 需要去掉引号,因为 pymysql 会自动为我们加上
res=cursor.execute(sql,[user,pwd]) # pymysql 模块自动帮我们解决 sql 注入的问题,只要我们按照 pymysql 的规矩来。

4. 增、删、改:conn.commit()

import pymysql
# 链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='xiao')
# 游标
cursor=conn.cursor()# 执行 sql 语句
# part1
# sql='insert into userinfo(name,password) values("root","123456");'
# res=cursor.execute(sql) # 执行 sql 语句,返回 sql 影响成功的行数
# print(res)# part2
# sql='insert into userinfo(name,password) values(%s,%s);'
# res=cursor.execute(sql,("root","123456")) # 执行 sql 语句,返回 sql 影响成功的行数
# print(res)# part3
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) # 执行 sql 语句,返回 sql 影响成功的行数
print(res)conn.commit() # 提交后才发现表中插入记录成功
cursor.close()
conn.close()

5. 查:fetchone,fetchmany,fetchall

import pymysql
# 链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='xiao')
# 游标
cursor=conn.cursor()# 执行 sql 语句
sql='select * from userinfo;'
rows=cursor.execute(sql) # 执行 sql 语句,返回 sql 影响成功的行数 rows,将结果放入一个集合,等待被查询# cursor.scroll(3,mode='absolute') # 相对绝对位置移动
# cursor.scroll(3,mode='relative') # 相对当前位置移动
res1=cursor.fetchone()
res2=cursor.fetchone()
res3=cursor.fetchone()
res4=cursor.fetchmany(2)
res5=cursor.fetchall()
print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
print('%s rows in set (0.00 sec)' %rows)conn.commit() # 提交后才发现表中插入记录成功
cursor.close()
conn.close()

6. 获取插入的最后一条数据的自增 ID

import pymysql
conn=pymysql.connect(host='localhost',user='root',password='123',database='xiao')
cursor=conn.cursor()sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) # 在插入语句后查看conn.commit()cursor.close()
conn.close()

结语

通过这个21天的Python计划,我们涵盖了MySQL数据备份与Python操作实战指南。希望这些内容能帮助你更好地理解和使用Python。继续学习和实践,你将成为一名优秀的Python开发者!

📢 注意啦!文末有彩蛋!参与抽奖就有机会把这本好书抱回家~动动手指,说不定下个锦鲤就是你!赠书福利

关键字:长沙正规网站建设价格_游戏开发物语完美搭配_东莞做网站推广_成都专业的整站优化

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: