Rao's Blog

  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

Chrome 安装 JsonView 插件

发表于 2020-01-19 | 分类于 其他

安装

1、Github 下载 JSONView-for-Chrome,并解压缩到相应目录。

2、打开 Chrome 扩展程序,点击 “加载正在开发的扩展程序…” -> 选择插件目录(…\JSONView-for-Chrome-master\WebContent)。

3、安装完成,重新加载。

安装调试工具 vue-devtools

发表于 2020-01-19 | 更新于 2020-03-23 | 分类于 前端

简介

vue-devtools 是一款基于浏览器的插件,用于调试 vue 应用,这可以极大地提高我们的调试效率。

安装

1
2
3
4
git clone https://github.com/vuejs/vue-devtools.git
cd vue-devtools
cnpm install
npm run build

如果编译失败,可直接将已编译好的 .crx 文件,拖入 Chrome 拓展程序 页面。

1
2
链接: https://pan.baidu.com/s/139hspAnspD7bJbo81xigmg 
密码: 1hsv

前端学习笔记

发表于 2020-01-13 | 更新于 2020-01-16 | 分类于 前端

学习路径

目标

基础:前端入门基础

  • HTML + CSS
  • JS 基础
  • 目标:掌握前端基础知识,能够使用进行简单应用开发(例如记事本)

进阶:框架:Vue,技术全家桶

  • webpack
  • vue-cli
  • vue
  • vue-router
  • axios
  • echarts
  • vux
  • elementui
  • ant-design
  • 目标:
    • 能够开发中等复杂规模的应用熟练应用
    • Vue.js 全家桶技术栈
    • 学会组件化、模块化开发方式

学习资源

bilibili | 极客时间 | 掘金 | Github | 码云

  • 【千锋教育】web前端 1000集全套
  • vue 基础
  • 项目实战课程

实践

脚手架搭建

1
2
3
4
5
6
7
8
9
10
npm -V
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm -V
sudo cnpm install vue-cli -g
vue -V
vue init webpack vue-demo
cd vue-demo
cnpm run dev

cnpm install axios --save

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
├── build # 项目构建(webpack)目录,一般情况下不需要自行配置
├── config # 项目配置目录,配置端口号等
├── node_modules # npm加载的项目依赖模块
├── src # 项目主开发目录
│   ├── App.vue # 项目主组件
│   ├── assets # 静态目录,例如图片等
│   ├── components # 公共组件目录
│   ├── main.js # 程序入口文件,加载各种公共组件
│ ├── store # vuex状态管理
│   └── router # vue-router路由管理
├── static # 静态资源目录,如图片、字体等
├── index.html # 主页
├── package.json # 项目依赖包及版本信息
└── README.md # 项目说明

组件化思想

几乎任意类型的应用界面都可以抽象为一个组件树:

项目实战

2020

发表于 2020-01-05 | 更新于 2020-01-13

单

单:支撑全量 MySQL、云数据库、Redis 在内的智能运维能力,为应用提供可视功能和增值服务。

横向:

  • 数据库实例接管数:200个(MySQL 实例:100个、Redis 实例:60个、云数据库实例:40个)
  • 数据库服务可用性:99.99%

纵向:

  • 智能运维平台:承接智能运维任务,建设数据库自动化运维平台,支撑全量 MySQL、云数据库、Redis 在内的自动化运维能力 | 混合云数据库管理。
    • CMDB(项目、实例、类型、来源、环境、角色、版本、机房、运行状态、复制状态、描述)
    • 监控
    • 告警
    • 慢日志
    • 拓扑图
    • 活跃会话
    • 工单
    • 诊断报告
  • 数据库运维:承接 MySQL、Redis 数据库的运维,通过运维工单等手段快速闭环问题,提升服务可用性。
  • 项目支撑:承接海外领域接口任务,做好领域接口工作,用平台能力为领域赋能。

领域接口

领域 接口人
市场 ToB –
用户运营 潘广通
市场中台 聂明明
研发 赵俊
制造 徐金良
供应链 潘广通
海外 饶辉
售后 王建坤

技术公众号

PSI 技术黑板报

MySQL · 常用架构方案

发表于 2019-12-25 | 分类于 MySQL

架构原则

  • 高可用
  • 高性能
  • 一致性
  • 扩展性

常见的架构方案

方案一:主备架构,只有主库提供读写服务,备库冗余作故障转移用

img

  • 高可用分析:高可用,主库挂了,keepalived(只是一种工具)会自动切换到备库,这个过程对业务层是透明的,无需修改代码或配置。
  • 高性能分析:读写都操作主库,很容易产生瓶颈。大部分互联网应用读多写少,读会先成为瓶颈,进而影响写性能。另外,备库只是单纯的备份,资源利用率 50%,这点方案二可解决。
  • 一致性分析:读写都操作主库,不存在数据一致性问题。
  • 扩展性分析:无法通过加从库来扩展读性能,进而提高整体性能。
  • 可落地分析:两点影响落地使用。第一、性能一般,这点可以通过建立高效的索引和引入缓存来增加读性能,进而提高性能,这也是通用的方案。第二、扩展性差,这点可以通过分库分表来扩展。

方案二:双主架构,两个主库同时提供服务,负载均衡

  • 高可用分析:高可用,一个主库挂了,不影响另一台主库提供服务。这个过程对业务层是透明的,无需修改代码或配置。
  • 高性能分析:读写性能相比于方案一都得到提升,提升一倍。
  • 一致性分析:存在数据一致性问题。请看,一致性解决方案。
  • 扩展性分析:当然可以扩展成三主循环,但笔者不建议(会多一层数据同步,这样同步的时间会更长)。如果非得在数据库架构层面扩展的话,扩展为方案四。
  • 可落地分析:两点影响落地使用。第一、数据一致性问题,一致性解决方案可解决问题。第二、主键冲突问题,ID 统一地由分布式 ID 生成服务来生成可解决问题。

方案三:主从架构,一主多从,读写分离

  • 高可用分析:主库单点,从库高可用。一旦主库挂了,写服务也就无法提供。
  • 高性能分析:大部分互联网应用读多写少,读会先成为瓶颈,进而影响整体性能。读的性能提高了,整体性能也提高了。另外,主库可以不用索引,线上从库和线下从库也可以建立不同的索引(线上从库如果有多个还是要建立相同的索引,不然得不偿失;线下从库是平时开发人员排查线上问题时查的库,可以建更多的索引)。
  • 一致性分析:存在数据一致性问题。请看,一致性解决方案。
  • 扩展性分析:可以通过加从库来扩展读性能,进而提高整体性能。(带来的问题是,从库越多需要从主库拉取binlog日志的端就越多,进而影响主库的性能,并且数据同步完成的时间也会更长)
  • 可落地分析:两点影响落地使用。第一,数据一致性问题,一致性解决方案可解决问题。第二,主库单点问题,笔者暂时没想到很好的解决方案。

方案四:双主 + 主从架构,看似完美的方案

  • 高可用分析:高可用。
  • 高性能分析:高性能。
  • 一致性分析:存在数据一致性问题。请看,一致性解决方案。
  • 扩展性分析:可以通过加从库来扩展读性能,进而提高整体性能。(带来的问题同方案二)
  • 可落地分析:同方案二,但数据同步又多了一层,数据延迟更严重。

一致性解决方案

第一类:主库和从库一致性解决方案

注:图中圈出的是数据同步的地方,数据同步(从库从主库拉取 binlog 日志,再执行一遍)是需要时间的,这个同步时间内主库和从库的数据会存在不一致的情况。如果同步过程中有读请求,那么读到的就是从库中的老数据。如下图。

既然知道了数据不一致性产生的原因,有下面几个解决方案供参考:

1、直接忽略,如果业务允许延时存在,那么就不去管它。

2、强制读主,采用主备架构方案,读写都走主库。用缓存来扩展数据库读性能 。有一点需要知道:如果缓存挂了,可能会产生雪崩现象,不过一般分布式缓存都是高可用的。

3、选择读主,写操作时根据库 + 表 + 业务特征生成一个 key 放到 Cache 里并设置超时时间(大于等于主从数据同步时间)。读请求时,同样的方式生成 key 先去查 Cache,再判断是否命中。若命中,则读主库,否则读从库。代价是多了一次缓存读写,基本可以忽略。

4、半同步复制,等主从同步完成,写请求才返回。就是大家常说的“半同步复制” semi-sync。这可以利用数据库原生功能,实现比较简单。代价是写请求时延增长,吞吐量降低。

5、数据库中间件,引入开源( mycat 等)或自研的数据库中间层。个人理解,思路同选择读主。数据库中间件的成本比较高,并且还多引入了一层。

第二类:DB 和缓存一致性解决方案

先来看一下常用的缓存使用方式:

第一步:淘汰缓存;

第二步:写入数据库;

第三步:读取缓存?返回:读取数据库;

第四步:读取数据库后写入缓存。

注:如果按照这种方式:图一、不会产生 DB 和缓存不一致问题;图二、会产生 DB 和缓存不一致问题,即 4.read 先于 3.sync 执行。如果不做处理,缓存里的数据可能一直是脏数据。解决方式如下:

注:设置缓存时,一定要加上失效时间,以防延时淘汰缓存失败的情况!

总结

  • 加缓存和索引是通用的提升数据库性能的方式。
  • 分库分表带来的好处是巨大的,但同样也会带来一些问题。
  • 不管是主备 + 分库分表还是主从 + 读写分离 + 分库分表,都要考虑具体的业务场景。某 8 到家发展四年,绝大部分的数据库架构还是采用方案一和方案一 + 分库分表,只有极少部分用方案三 + 读写分离 + 分库分表。另外,阿里云提供的数据库云服务也都是主备方案,要想主从 + 读写分离需要二次架构。
  • 记住一句话:不考虑业务场景的架构都是耍流氓。

Java · 项目 · mall

发表于 2019-12-24 | 更新于 2020-01-20 | 分类于 Java

后端

项目简介

mall 项目是一套电商系统,包括前台商城系统及后台管理系统,基于 SpringBoot + MyBatis 实现。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。

后端 | 前端 | 学习教程

项目演示

  • 后台项目演示:http://www.macrozheng.com/admin/index.html | [admin/macro123]
  • 移动端项目演示:http://www.macrozheng.com/app/index.html

技术选型

后端

技术 说明
Spring Boot 容器 + MVC 框架
Spring Security 认证和授权框架
MyBatis ORM 框架
MyBatis Generator 数据层代码生成
PageHelper MyBatis 物理分页插件
Swagger UI 文档生产工具
Elasticsearch 搜索引擎
RabbitMQ 消息队列
Redis 分布式缓存
MongoDB NoSQL 数据库
Docker 应用容器引擎
Druid 数据库连接池
OSS 对象存储
JWT JWT 登录支持
Lombok 简化对象封装工具
Hibernator-Validator 验证框架
LogStash 日志收集工具
Kibana 为 Elasticsearch 设计的开源分析和可视化平台

前端

技术 说明
Vue 前端框架
Vue-router 路由框架
Vuex 全局状态管理框架
Element 前端 UI 框架
Axios 前端 HTTP 框架
v-charts 基于 Echarts 的图表框架
Js-cookie cookie 管理工具
nprogress 进度条控件
vue-element-admin 项目脚手架参考

功能概览

  • 商品模块
    • 商品管理
    • 商品分类管理
    • 商品类型管理
    • 品牌管理
  • 订单模块
    • 订单管理
    • 订单设置
    • 退货申请处理
    • 退货原因设置
  • 营销模块
    • 秒杀活动管理
    • 优惠价管理
    • 品牌推荐管理
    • 新品推荐管理
    • 人气推荐管理
    • 专题推荐管理
    • 首页广告管理

数据库表

  • cms_*:内容管理模块相关表
  • oms_*:订单管理模块相关表
  • pms_*:商品模块相关表
  • sms_*:营销模块相关表
  • ums_*:会员模块相关表

工具篇

工具 说明
IDEA 开发 IDE
Redis Desktop Redis 客户端连接工具
Robomongo MongoDB 客户端连接工具
XShell Linux 远程连接工具
Navicat 数据库连接工具
Power Designer 数据库设计工具
Axure 原型设计工具
XMind 思维导图设计工具
ScreenToGif gif 录制工具
ProcessOn 流程图绘制工具
PicPick 图片处理工具
Snipaste 屏幕截图工具

架构篇

系统微服务架构图

mall_micro_service_arch.jpg

业务篇

mall_business_arch.png

代码篇

1
2
3
4
5
6
7
8
mall
├── mall-common -- 工具类及通用代码
├── mall-mbg -- MyBatis Generator 生成的数据库操作代码
├── mall-security -- Spring Security 封装公用模块
├── mall-admin -- 后台商城管理系统接口
├── mall-search -- 基于 Elasticsearch 的商品搜索系统
├── mall-portal -- 前台商城系统接口
└── mall-demo -- 框架搭建时的测试代码

前端

技术选型

技术 说明 官网
Vue 前端框架 https://vuejs.org/
Vue-router 路由框架 https://router.vuejs.org/
Vuex 全局状态管理框架 https://vuex.vuejs.org/
Element 前端 UI 框架 https://element.eleme.io/
Axios 前端 HTTP 框架 https://github.com/axios/axios
v-charts 基于 Echarts 的图表框架 https://v-charts.js.org/
Js-cookie cookie 管理工具 https://github.com/js-cookie/js-cookie
nprogress 进度条控件 https://github.com/rstacruz/nprogress
vue-element-admin 项目脚手架参考 https://github.com/PanJiaChen/vue-element-admin

工程目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
src -- 源码目录
├── api -- axios网络请求定义
├── assets -- 静态图片资源文件
├── components -- 通用组件封装
├── icons -- svg矢量图片文件
├── router -- vue-router路由配置
├── store -- vuex的状态管理
├── styles -- 全局css样式
├── utils -- 工具类
└── views -- 前端页面
├── home -- 首页
├── layout -- 通用页面加载框架
├── login -- 登录页
├── oms -- 订单模块页面
├── pms -- 商品模块页面
└── sms -- 营销模块页面

打包部署

前端项目部署:

1、下载前端代码 mall-admin-web

2、VS Code 打开代码

3、打开控制台,通过 npm install 命令安装相关依赖

4、修改 dev.env.js 文件中 BASE_API,使用线上 API 进行访问,线上地址为:http://120.27.63.9:8080

1
2
3
4
5
6
7
8
9
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')

module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
// 后台API地址:BASE_API: '"http://10.133.0.53:8080"'
BASE_API: '"http://120.27.63.9:8080"'
})

5、通过 npm run dev 命令,启动 mall-admin-web

6、访问地址 http://localhost:8090 查看效果

后端项目部署

1
2
3
4
# 构建镜像
docker build -t mall/mall-admin:1.0-SNAPSHOT .
docker build -t mall/mall-portal:1.0-SNAPSHOT .
docker build -t mall/mall-search:1.0-SNAPSHOT .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 删除镜像
docker rmi registry.cn-qingdao.aliyuncs.com/raoo/images:v1.0.0

# 拉取镜像
docker pull registry.cn-qingdao.aliyuncs.com/raoo/images:v1.0.0

# 启动镜像
docker run -p 8080:8080 --name mall-admin \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/admin/logs:/var/logs \
-d mall/mall-admin:1.0-SNAPSHOT

# 移除容器
docker rm xx

常用命令

1
2
3
4
5
6
docker search java:在 Docker Hub(或阿里镜像)仓库中搜索关键字(如java)的镜像
docker pull java:8:从仓库中下载镜像,若要指定版本,则要在冒号后指定
docker images:列出已经下载的镜像
docker rmi java:删除本地镜像
docker build:构建镜像
docker tag 0ead9e3f95d6 mall/mall-admin:1.0-SNAPSHOT:修改镜像

Dockerfile

1
2
3
FROM java:8
ADD /mall-search-1.0-SNAPSHOT.jar //
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod","/mall-search-1.0-SNAPSHOT.jar"]

企业上云实践:数据库迁移方案

发表于 2019-12-23 | 更新于 2020-01-09 | 分类于 阿里云

一、背景

对于众多企业来说,云的优势越来越明显,出于想使用成熟技术、减少运维成本、提升系统性能等方面的考虑,纷纷向“云”看齐。不过,在涉及到本地或云端的具体实施过程时,一个较为重要的问题就是数据的迁移。如何使用云服务商提供的迁移工具可以实现在自建应用不停服较长时间的情况下,平滑地完成自建数据库的迁移上云是一个首先需要解决的问题。

二、数据库迁移上云方案介绍

以阿里云为例:主要使用 DTS 服务,实现本地 IDC 与阿里云 RDS 的数据迁移。

不通的迁移方案应对不同的场景:

场景 迁移方案
本地 IDC 与阿里云机房,有专线 通过专线迁移
本地 IDC 与阿里云,无专线,但数据库可开通公网 IP 通过公网 IP 迁移
本地 IDC 与阿里云,无专线,且数据库不可开通公网 IP 通过 ECS 自建数据库与本地自建数据库搭成主从,再通过阿里云内网迁移
本地 IDC 与阿里云机房,有专线,但不是同一个主账号 通过 RDS 中转迁移,参考 使用DTS跨阿里云账号迁移RDS数据

三、数据库迁移基本原理

  • 结构迁移:将源库中待迁移对象的结构迁移至目标库(例如表、视图、触发器、存储过程等)。
  • 全量数据迁移:将源库中存量数据,全部迁移到目标库中。
  • 增量数据迁移:将与源库保持实时同步的状态,使用增量迁移功能,可以将系统迁移过程中的应用停机时间降低到分钟级别。

四、准备与注意事项

准备事项:

  • 已开通 RDS 服务
  • 已开通 DTS 服务
  • 源库网络可通,已创建账号,并连接测试通过
  • 目标库,已创建账号,并连接测试通过

注意事项:

  • 由于执行业务切换操作需要停止数据库写入并暂停业务,请选择业务低峰期操作以降低影响。
  • 由于源库区分大小写、目标库未区分大小写,会导致迁移失败,迁移前请将库名和表名全部改成小写。
  • 不同版本迁移,会存在由于语法差异导致视图或者触发器结构迁移失败,可以先忽略错误。
  • 增量迁移期间,不能执行 DDL 语句,否则会迁移中断。

五、操作实践:用户中心本地自建数据库迁移至阿里云RDS

基本信息:

源库信息 目标库信息
数据库版本 MariaDB 10.1.19 MySQL 5.7
机房区域 北京亦庄 华为2(北京)
数据量 170 GB ~
要求 1. 分钟级停服;2. 失败可回退。 ~
迁移方案 公网 IP + 结构 + 全量 + 增量 ~

操作步骤:

1、进入 DTS 控制台,创建迁移任务

2、配置源库和目标库,并连接测试通过

3、选择迁移类型和列表

4、预检查

5、启动迁移任务

6、实时跟踪迁移进度

7、将业务中断,禁止新的数据写入源数据库

8、结束数据迁移任务

观察迁移任务的进度为增量迁移,并显示为无延迟状态时,将源库停写几分钟,等待迁移任务的增量迁移再次进入无延迟状态后,手动结束迁移任务。

9、创建反向数据迁移任务并启动

用于将目标库后续产生增量数据迁移回源数据库,此步骤创建的反向迁移任务的作用是为业务提供回退方案,业务恢复运行后,一旦出现异常可将业务切换至原有的数据库中。

⚠️ 警告:在配置反向数据迁移任务时,在设置迁移类型及列表环节仅需选择增量数据迁移。

​

堡垒机登录

发表于 2019-12-20 | 更新于 2019-12-31 | 分类于 Linux

阿里云 ECS 服务器

1
2
3
4
5
6
# 登陆账户:工号 + 密码
# 内网登录
ssh -p 60022 01510886@10.163.193.54

# 公网登陆
ssh -p 60022 01510886@47.104.192.254

本地 IDC 服务器

1
ssh -p 2222 01510886@10.138.16.192

Liunx · 基础命令

发表于 2019-12-19 | 更新于 2020-08-12 | 分类于 Linux

Liunx 命令

使用 :s 命令可以实现字符串的替换

1
2
3
4
5
6
7
8
9
10
11
# 用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/

# 用字符串 str2 替换行中所有出现的字符串 str1
:s/str1/str2/g

# 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:.,$ s/str1/str2/g

# 用字符串 str2 替换正文中所有出现的字符串 str1
:1,$ s/str1/str2/g

Shell 基础

  • #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
1
2
#!/bin/bash
echo "Hello World !"
  • 字符串 ‘’ 和 “” 的区别:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;双引号里可以有变量或者转义字符。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
your_name="test"

# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3

# 输出结果
hello, test ! hello, test !
hello, test ! hello, ${your_name} !
  • 以 # 开头的行就是注释。
  • 传递参数
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程 ID 号
$! 后台运行的最后一个进程的 ID 号
$@ 以 “$n” 的形式输出所有参数
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:" * " 等价于 "1 2 3"(传递了一个字符串参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

#!/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done

# 输出结果
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
  • 数组
1
2
3
4
5
# 获取数组所有元素 
${my_array[*]}

# 获取数组长度
${#my_array[*]}
  • 基本运算符
数字运算符 说明
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
字符串运算符 说明
= 检测两个字符串是否相等,相等返回 true。
!= 检测两个字符串是否相等,不相等返回 true。
-z 检测字符串长度是否为 0,为 0 返回 true。
-n 检测字符串长度是否不为 0,不为 0 返回 true。
$ 检测字符串是否为空,不为空返回 true。
逻辑运算符 说明
&& 逻辑的 AND
|| 逻辑的 OR
文件运算符 说明
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于 0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
  • 流程控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# if else
if condition
then
command1
command2
...
commandN
else
command
fi

# for
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

# while
while condition
do
command
done

# case ... esac
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
  • 函数
1
2
3
4
5
[ function ] funname [()]
{
action;
[return int;]
}
  • 输入、输出重定向
命令 说明
command > file 将输出重定向到 file
command < file 将输入重定向到 file
command >> file 将输出以追加的方式重定向到 file
n > file 将文件描述符为 n 的文件重定向到 file
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file
n >& m 将输出文件 m 和 n 合并
n <& m 将输入文件 m 和 n 合并
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入

注意:文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)

1
2
3
4
5
# 将 stdout 和 stderr 合并后重定向到 file
$ command > file 2>&1

# /dev/null 是一个特殊的文件,将命令的输出重定向到它,会起到"禁止输出"的效果
$ command > /dev/null 2>&1

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null。

学习资料

  • Linux 命令大全
  • Linux 入门

MySQL · 数据转移

发表于 2019-12-18 | 更新于 2020-04-20

背景

北京亦庄机房,MySQL 数据库服务器

主:10.159.39.238

从:10.159.39.239

操作

  • 修改表名
1
rename table xx to xx_bak;
  • 将表数据插入到另外一张表
1
2
3
4
5
6
7
8
9
10
11
12
lock tables haier_user_clientsso_log read;
show open tables where in_use > 0;

insert INTO haier_user_clientsso_log_bak select * FROM haier_user_clientsso_log WHERE id > 20085299;

rename table haier_user_clientsso_log haier_user_clientsso_log_copy;
rename table user.haier_user_clientsso_log_bak haier_user_clientsso_log;

unlock tables;
show open tables where in_use > 0;

select count(*) from haier_user_clientsso_log WHERE id > 20085299;
1234…18
Hui Rao

Hui Rao

最好的成长是分享
173 日志
19 分类
14 标签
GitHub E-Mail
© 2021 Hui Rao
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v7.1.0
|