Mysql备份

目的 为了后续迁移方便,方便恢复,防止意外,确保网站迁移时数据不会丢失。无论是因为技术故障、操作失误,还是遭遇黑客攻击,有备份在手,我们就能快速恢复博客,避免数据丢失带来的困扰。 备份方法 我将整个备份过程制作成了一个流程图,简明扼要地展示了每一步操作: 我的博客系统中主要是备份 mysql和上传的 资源文件,主要是针对这两方面进行备份 mysql备份 通过mysql自带mysqldump进行备份 程序查询表的所有数据,模拟mysqldump备份 资源文件备份 压缩备份 mysql备份 mysql 最佳备份方式无疑是使用 mysql 自带的 mysqldump 工具。然而,当你的 MySQL 数据库和项目部署在不同的服务器上,或者使用 Docker 等容器化技术时,通过程序执行命令脚本可能无法正常使用。因此,可以通过模拟 mysqldump 备份的方式来实现 MySQL 的备份。下面我们将先分析 mysqldump,然后通过代码实现备份。 基本备份命令 要备份一个MySQL数据库,可以使用以下命令: mysqldump -u [username] -p [database_name] > [backup_file].sql -u [username]:数据库用户名 -p:提示输入数据库用户密码 [database_name]:要备份的数据库名称 > [backup_file].sql:备份文件的输出路径和文件名 示例: mysqldump -u root -p mydatabase > mydatabase_backup.sql 恢复备份命令 从备份文件恢复数据库,可以使用以下命令: mysql -u [username] -p [database_name] < [backup_file].sql 示例: mysql -u root -p mydatabase < mydatabase_backup.sql 备份文件结构 通过分析 mysqldump 生成的备份文件,可以看到其中的表结构和数据。下面是对表 b_article_tag 的完整备份结构: -- -- Table structure for table b_article_tag -- DROP TABLE IF EXISTS b_article_tag; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE b_article_tag ( id int NOT NULL AUTO_INCREMENT COMMENT 'id', article_id int NOT NULL COMMENT '文章id', tag_id int NOT NULL COMMENT '标签id', PRIMARY KEY (id) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='文章标签关联'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table b_article_tag -- LOCK TABLES b_article_tag WRITE; /*!40000 ALTER TABLE b_article_tag DISABLE KEYS */; INSERT INTO b_article_tag VALUES (1,1,1),(2,2,2),(3,3,1),(4,4,2),(5,5,1),(6,6,2),(7,7,1),(8,8,2),(9,9,1),(10,10,2),(12,14,3); /*!40000 ALTER TABLE b_article_tag ENABLE KEYS */; UNLOCK TABLES; 让我们逐行解释这个脚本的含义。 ...

7 分钟 · Insane庆

Mysql并发事务出现的问题

在使用SQL时,大都会遇到这样的问题,你Update一条记录时,需要通过Select来检索出其值或条件,然后在通过这个值来执行修改操作。 但当以上操作放到多线程中并发处理时会出现问题:某线程select了一条记录但还没来得及update时,另一个线程仍然可能会进来select到同一条记录。 如果清楚MySQL是如何执行查询的,就知道为什么会这样子了。 因为执行SELECT count(*) FROM tb1 AS inner_tb1 WHERE inner_tb1.type = outer_tb1.type的时候会获得读锁(共享锁),一旦数据表被加上读锁,其他请求可以对该表再次增加读锁,但是不能增加写锁。(当一个请求在读数据时,其他请求也可以读,但是不能写,因为一旦另外一个线程写了数据,就会导致当前线程读取到的数据不是最新的了。这就是不可重复读现象) 这是也可以通过跳过这个限制,但是这个时候就出现问题了,由于临时表是先查出来,然后在进行更新,如果先查询出来,如果在临时表中加入for update还没用,因为是临时表 set autocommit = 0; update wms_ware_sku set stock = stock - 100 where sku_id in (select sku_id from (SELECT sku_id from wms_ware_sku where stock > 0) as a); set autocommit = 1; 正确解法,使用悲观锁先锁住数据,然后进行更新 BEGIN; select sku_id from wms_ware_sku where stock > 0 for update update wms_ware_sku set stock = stock - 100 where sku_id in (select sku_id from wms_ware_sku where stock > 0); COMMIT; 可以发现使用for update 查询请求也会被禁止 但是没有for update就不会被禁止

1 分钟 · Insane庆

Python基础

python的安装 python入门 python的第一个程序陀螺 import turtle t=turtle.Pen() ''' 陀螺代码 ''' for x in range(360): t.forward(x) t.left(59) python的第二个程序奥运五环 import turtle turtle.width(10) #设置圆圈的颜色 turtle.color("blue") turtle.circle(50) #把笔抬起来 turtle.penup() #让笔到目标位子 turtle.goto(120,0) #把笔放下 turtle.pendown() turtle.color("black") turtle.circle(50) turtle.penup() turtle.goto(240,0) turtle.pendown() turtle.color("red") turtle.circle(50) turtle.penup() turtle.goto(60,-50) turtle.pendown() turtle.color("yellow") turtle.circle(50) turtle.penup() turtle.goto(180,-50) turtle.pendown() turtle.color("green") turtle.circle(50) python的基础语法 1 python中的注释#,’'' 注释是程序中会被Python 解释器忽略的一段文本。程序员可以通过注释记录任意想写的内 容,通常是关于代码的说明。 Python 中的注释只有单行注释,使用#开始知道行结束的部分。 注释是个好习惯,方便自己方便他人 a = [10,20,30] #生成一个列表对象,变量a 引用了这个变量 2、使用\行连接符 一行程序的长度是没有限制的,但是为了可读性更强通常将一行比较长的程序分为多行。这 是,我们可以使用\行连接符,把它放在行结束的地方。Python 解释器仍然将它们解释为同 一行。 >>> a = [10,20,30,40,\ 50,60,70,\ 80,90,100] >>> a [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] >>> a = 'abcdefghijklmnopqrstuvwxyz' >>> b = 'abcdefg\ hijklmn\ opqrst\ uvwxyz' >>> a 'abcdefghijklmnopqrstuvwxyz' >>> b 'abcdefghijklmnopqrstuvwxyz' 3、 python对象的定义 a = "asdfsadfaf" print(a) print(id(a)) print(type(a)) python把每一个数据都定义为一个对象,里面包含着各种信息 ...

15 分钟 · Insane庆

SpringCloud

SpringCloud 1 springCloud理论知识的讲解 1.1 什么是微服务 In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.——James Lewis and Martin Fowler (2014) 微服务是一种架构风格 一个应用拆分为一组小型服务 每个服务运行在自己的进程内,也就是可独立部署和升级 服务之间使用轻量级HTTP交互 服务围绕业务功能拆分 可以由全自动部署机制独立部署 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术 ...

64 分钟 · Insane庆

云服务

1 私有网络VPC 1.1 私有网络掩码 可用网段就从16位开始 如果后面掩码是18 可用网段就从18位开始 1.2 阿里云vpc划分网段

1 分钟 · Insane庆

从零开始uniapp微信小程序项目到发布

最近微信小程序又掀起一波风潮,本文站在新手的角度出发,比较适合第一次使用uniapp 开发微信小程序的伙伴,或者没有过实战经验的小伙伴参考,从零搭建uniapp小程序项目 一、开发前的准备 1.1 下载工具 hbuilder首页:https://www.dcloud.io/hbuilderx.html 下载hbuilder编辑器,选择对应的系统,Windows和mac正式版即可,下载好安装路径不要放在C盘,此编辑器作为主要开发编辑器 微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 下载微信开发者工具,选择对应的系统,正式版即可,下载好安装路径不要放在C盘,此工具主要用于开发是预览小程序 1.2 申请微信小程序 微信公众平台:https://mp.weixin.qq.com/ 进入微信公众平台-> 点击立即注册-> 点击小程序-> 点击前往注册 填写信息。注意:邮箱需要,未被微信公众平台注册,未被微信开放平台注册,未被个人微信号绑定的邮箱 注册好后,扫码登陆平台,页面向下滚动,找到左边的开发,选择开发管理,右边页面选择开发设置,这里会有一个AppID,作为绑定开发者工具用(注意不要暴露,使用在后文) 二、新建项目 打开hbuilder编辑器选择文件->新建->项目 这里uniapp会提供很多初始化模板,可根据需求选择,此文以默认模板作为演示 填写项目名称 选择项目存放的路径 vue版本选择(此文以通俗易懂的2.0作为演示,3.0大同小异) 默认不启用 uniCloud和git 点击创建 试运行: 可能会出现没有配置微信开发工具情况,此时需要配置微信开发者工具路径 点击浏览 选择刚才安装微信开发者工具安装路径 配置微信开发者工具: 设置->安全设置-》开启服务端口 运行: 运行->运行到小程序模拟器->微信开发者工具 运行成功: 微信开发者工具会自动弹出来,可能没登录需要扫码登录微信开发者工具 三、项目结构 文件名 用途 pages 用于放置页面文件 static 静态文件位置 App.vue 主文件 同vue main.js 同vue manifest.json 项目配置(下文详讲) pages.json 页面配置(下文详讲) uni.scss 全局样式文件 3.1 manifest.json配置 此文主要用于开发微信小程序,其他的配置可以暂时不管,选择微信小程序配置 ...

3 分钟 · Insane庆

包装http请求为https

1.安装nginx 2.添加配置文件,证书用腾讯云免费的域名,具体网上搜一搜

1 分钟 · Insane庆

大数据

hadoop Hadoop总结 1 Hadoop注意事项 reduce方法参数中的key和value,在执行过程中,变量指向的对象是同一个,每次迭代只是把新的值直接在内存中对对象的内容进行修改 package com.atguigu.mr.writableComparable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class FlowReducer extends Reducer<FlowBean, NullWritable,FlowBean,NullWritable> { FlowBean k = new FlowBean(); @Override protected void reduce(FlowBean key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException { Long upFlow = 0L; Long downFlow=0L; for (NullWritable value : values) { upFlow += key.getUpFlow(); downFlow += key.getDownFlow(); } k.setPhoneNumber(key.getPhoneNumber()); k.setUpFlow(upFlow); k.setDownFlow(downFlow); context.write(k, NullWritable.get()); } } 这样也可以进行合并 ...

77 分钟 · Insane庆

正则解析

正则表达式——详情版+常用表达式 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。 1.[]:表示一个字符,该字符可以是[]中指定的内容 例如: [abc]:这个字符可以是a或b或c [a-z]:表示任意一个小写字母 [a-zA-Z]:表示任意一个字母 [a-zA-Z0-9_]:表示任意一个数字字母下划线 [^abc]:该字符只要不是a或b或c 2.预定义字符: . :表示任意一个字符,没有范围限制 \d :表示任意一个数字,等同于[0-9] \w :表示任意一个单词字符,等同于[a-zA-Z0-9_]–单词指字母/数字/_ \s :表示任意一个空白字符 \D :表示不是数字 \W :不是单词字符 \S:不是空白字符 3.量词: ? :表示前面的内容出现0-1次 例如: [abc]? 可以匹配:a 或 b 或 c 或什么也不写 + :表示前面的内容最少出现1次 例如: [abc]+ 可以匹配:b或aaaaaaaaaa…或abcabcbabcbabcba… 但是不能匹配:什么都不写 或 abcfdfsbbaqbb34bbwer… : 表示前面的内容出现任意次(0-多次)—匹配内容与+一致,只是可以一次都不写 例如: [abc]* 可以匹配:b或aaaaaaaaaa…或abcabcba…或什么都不写 但是不能匹配:abcfdfsbbaqbb34bbwer… {n} :表示前面的内容出现n次 例如: [abc]{3} 可以匹配:aaa 或 bbb 或 aab 或abc 或bbc 但是不能匹配: aaaa 或 aad {n,m} :表示前面的内容出现最少n次最多m次 例如: [abc]{3,5} 可以匹配:aaa 或 abcab 或者 abcc 但是不能匹配:aaaaaa 或 aabbd ...

2 分钟 · Insane庆

设置一个外网一个内网

1.解释 destination【网段地址】:172.16.31.0,这个假设是你内网需要访问的(目的IP段) mask【子网掩码】:内网需要访问的(目的IP段)掩码 gateway【网关地址】:把访问172.16.31.0的数据通过网关192.168.1.1(这个是你内网网关)转发出去。 Metric 【度量值】:数值越小越优先 if【接口地址】:一般不用指定 route add -p 172.16.31.0 mask 255.255.255.0 192.168.1.1 Metric 3 if 2 2.详解 双网卡内网静态分配,外网自动获取。 电脑内网卡设置为IP地址:10.2.2.115 子网掩码:255.255.255.0 网关留空。外网自动获取。 静态路由写法 route add -p 10.2.2.100 mask 255.255.255.0 10.2.2.1 route add -p 192.168.7.0 mask 255.255.255.0 192.168.124.1 route delete -p 192.168.7.0 mask 255.255.255.0 192.168.124.1 route delete 0.0.0.0 mask 0.0.0.0 192.168.124.1 方法一:禁用内网网关 两步:第一步内网网关不设置 第二步添加路由 route add -p 192.168.7.0 mask 255.255.255.0 192.168.124.1 方法二:设置优先级 设置跃点数 跃点数越低优先级越高 然后开放路由 route add -p 192.168.7.0 mask 255.255.255.0 192.168.124.1 ...

1 分钟 · Insane庆