电能质量-第04章 瞬态过电压
4.1 瞬态过电压的来源(Sources of Transient Overvoltages) 公用系统上的瞬态过电压主要有两大来源:电容器投切(capacitor switching)和雷电(lightning)。这两者同样也是终端用户设施内部瞬态过电压以及大量其他开关现象的来源。
数据库、Linux、云平台与工程实践笔记
4.1 瞬态过电压的来源(Sources of Transient Overvoltages) 公用系统上的瞬态过电压主要有两大来源:电容器投切(capacitor switching)和雷电(lightning)。这两者同样也是终端用户设施内部瞬态过电压以及大量其他开关现象的来源。
章节引言(Chapter 3 Intro) 电压暂降(voltage sags)和中断(interruptions)是彼此相关的电能质量问题。这两类问题通常都是由电力系统中的故障(faults)以及为隔离故障区段所采取的开关动作引起的。它们的特征是电压有效值(rms)出现超出正常运行范围的变化。
2.1 需要一致的术语体系(Need for a Consistent Vocabulary) “电能质量(power quality)”这一术语被用于描述电力系统中的多种电磁现象(electromagnetic phenomena)。近年来,随着电子设备(electronic equipment)和分布式发电(distributed generation)的应用不断增加,人们对电能质量的关注明显提高;与此同时,也形成了一套用于描述这些现象的专门术语体系。遗憾的是,这套术语在行业不同群体之间并不一致。这造成了相当大的混乱,因为设备供应商和终端用户都在努力理解:为什么电气设备没有像预期那样工作。同样,在各种厂商术语(vendor jargon)中辨别大量不同的解决方案,也令人困惑。
无论是电力公司(electric utilities),还是电力终端用户(end users of electric power),都越来越关注电力质量(the quality of electric power)。“电能质量(power quality)”这一术语,自 20 世纪 80 年代末以来,已经成为电力行业最常见的流行词之一。它是一个“总括性概念(umbrella concept)”,用来涵盖多种不同类型的电力系统扰动(power system disturbances)。这个“伞”下面所包含的问题本身并不一定是新的。真正新的地方在于,工程师现在正尝试用一种系统化的方法(system approach)来处理这些问题,而不是把它们作为一个个孤立问题分别处理。
本文译自英文著作 Electrical Power Systems Quality(原作者:Roger C. Dugan、Mark F. McGranaghan、Surya Santoso、H. Wayne Beaty)。该书是电能质量领域较为系统的工程参考资料,内容涵盖电压暂降与中断、瞬态过电压、谐波、长时电压变化、电能质量评估、分布式发电并网、接地与布线、电能质量监测等主题,兼顾原理分析与工程实践应用。
数据库系统的关系代数 关系代数的全部对象与运算,本质上都可以理解为:对元组集合做集合运算。因此理解关系代数前需要先理解集合论。 集合论 集合的概念和描述 集合set是一些对象的汇集,可以表示如下: A = \a,b,c\ 某个元素是否属于集合,用 \in或 \notin( in / notin)表示:
MYSQL优化常用策略 1. 优化数据访问 这种策略的思想是尽量减少数据访问。涵盖两方面: 一是应用程序减少对数据库数据的访问,包括访问频次和访问范围,对于数据时效性高的场景应当用中间件解决,而不是频繁访问数据库。 二是访问数据要减少实际扫描的记录数。 比如我们常会写下面这样的语句 select * from tb_orders where user_id = 123 order by create_time desc limit 20; 我们选择使用投影 select id,user_id,status,create_time from tb_orders where user_id = 123 order by create_time desc limit 20; 这样用不到的列是不会被扫描的,尤其是对于宽表来说,性能将提高不少。 尽早过滤是另外一种减少数据扫描的方法。 这同样又包含两种办法,一是过滤条件要早生效,这样后续的jion/sort/agg就会越轻松。二是where使用等值/范围,而不要使用表达式包裹 # 反例如下 where DATE(create_time) > '2025-12-29' # 推荐 where create_time >= '2025-12-29 00:00:00' and create_time < '2025-12-30 00:00:00' 控制返回行数 LIMIT子句有一个深分页问题,这往往也是性能结症所在。 select id,create_time from orders where user_id = 123 order by create_time desc limit 100000,20; 上面的语句就是典型的深分页,limit offset,size。 深分页慢的核心原因是MYSQL通常会按照ORDER BY找到前offset + size条记录,然后再丢弃前offset记录,只返回最后的size条记录。以上例而言,要找到 100001 ~ 100020条记录,数据库往往会先处理100020条记录。offset越大,scan/sort/agg的工作量越接近线性增长。即使有索引的清空下,仍要走大量的读索引+回表读取完整行的步骤,IO和CPU都会网上走。 更好的替代方案是使用上一页组后一条记录的排序健作为游标条件,而不是offset。这样MYSQL可以通过索引定位到游标位置,再向后取20条,直接跳过前面的100000行扫描。 select id,create_time from orders where user_id = 123 and (create_time,id) < ('2025-12-29 10:00:00',987654) order by create_time desc,id desc limit 20; # 对应推荐索引 create index idx_tb_orders_user_time_id on tb_orders(user_id,create_time,id); 在EXPLAIN中,type尽量从ALL变成range/ref/eq_ref/const,rows明显过大的要注意,Extra中出现Using temporary也要注意,key/key_len是否和预期一样索引命中。
SQL语句的生命周期 前面的内存架构,物理架构,进程架构偏向静态系统架构,有哪些部件,长什么样子,谁负责干什么。 现在可以通过描述一条SQL语句的生命周期将上面的各部分串起来,是一个偏动态的查询架构。一个SQL语句可以分为以下五部分:Parser → Analyzer → Rewriter → Planner → Executor。 从客户端报文到 exec_simple_query 这是语句生命的起始,客户端发送一条 Simple Query(文本协议)时,大致流程是:
PG的存储和文件系统 PG的目录结构 PG的目录结构这里分为两类,一类是源代码目录结构,就是git clone 下来的那棵树。还有一类就是数据目录结构(PGDATA),就是在初始化实例的时候生成的。 源代码目录结构 官方仓库 postgres/,其顶层大致如下 postgres/ configure # 配置脚本 src/ # 所有代码的主战场 doc/ # 文档 contrib/ # 扩展、示例模块 config/ # 各种模板配置 ... 官方使用doxygen 工具把 src/ 列成了一个目录树。核心子目录包括:backend/、bin/、common/、fe_utils/、include/、interfaces/、pl/、port/、test/、tools/、timezone/、tutorial/ 等。
Postgresql的内存架构 内存作为磁盘和CPU之间的中间层,是系统性能的重要部分,了解PG的内存架构,有助于数据库的性能分析。 一个PG实例的内存主要分为两大部分,共享内存及每个后端进程的专有内存。 后端进程的内存 需要注意的是,上面图中的 temp_buffers,work_mem,maintaince_work_mem,这些都是参数(GUNS),是每个后端进程中都有可能使用到的按照任务类型进行分类的内存使用种类,它们之间并没有物理隔离。 在操作系统看来,一个 backend 本质就是一个 Linux 进程,典型内存布局大概是: 上面几个内存概念都是同一个 backend 进程的虚拟地址空间里的不同区域。在OS看来,后端进程的内存就是进程+映射进来的共享内存+其他内存种类。 PG后端进程有自己的内存上下文结构,这意味着和其他程序可以随意malloc/free不同,PG里的内存操作,就要按照PG的规则来,具体而言,PG提供了MemoryContext 层次结构,一棵树状的内存池。 其核心的头文件有两个 memutils.h和palloc.h。而实现则主要在mcxt.c(MemoryContext 通用框架)和aset.c(申请内存)
Postgresql进程架构 进程作为操作系统中的重要概念,包含了程序代码以及相关的运行环境。每个进程在操作系统中都是独立的,具有自己的地址空间,并可以运行。Postgresql采用多进程架构,进程之间相互隔离,提高了安全性和稳定性。下面逐一介绍各种进程。 主进程(Postmaster) Postgresql的主进程传统上被称作Postmaster。就像这个形象的名称一样,作为PG的大boss,该进程是绝对不会干刷脏,复制这类蓝领工作的。postmaster主要负责以下工作:
Posgresql逻辑架构 database cluster 与oracle的多租户等不同,Postgresql允许你通过监听端口来区别数据库簇(database cluster)实例。一个数据库簇,或者叫数据库集群下面可以存放各种数据库(database),数据库簇之间是物理隔离的,即base目录是严格区分的,而一个数据库簇下的各个数据库的物理文件则是按照编号存放在$PGDATA/base目录下的,这个后面的物理架构会详细描述。数据库之间的逻辑是隔离的,也就是说,即使是在同一个数据库簇下,彼此是不能直接调用的,这点和MYSQL不太一样。
客户端 Postgresql的客户端工具有很多种,DataGrid,pgAdmin,Navicate等等。比起更人性化,返回结果更容易操作,编写sql有高亮有自动提示的这些工具,作为DBA的我,更推荐原生的psql。 psql - 最好的客户端工具 psql采用的是双命令行工具设计(Dual-mode Command-line Interface)。 连接数据库:psql -h localhost -p 5432 database_name 获得psql的帮助:\ 获得语法的帮助:\h STATEMENT 在shell中执行命令:psql -c “STATEMENT” 通过psql执行sql文件:psql < f.sql psql用法_转储 psql的轻便和易用往往超乎你的想象,比如你需要将某个节点上的表同步到其他节点上,如果用其他工具,你需要打开同步界面-选择节点信息-然后再在可视化页面里面寻找表格,然后再一直下一步直到同步完成。而上述这些操作,在psql这里只需要一行命令 pg_dump -h SRC -p 5432 -U USR -d SRCDB -t sch.tbl --no-owner --no-privileges \ | psql -h DST -p 5432 -U USR -d DSTDB psql用法_自定义psqlrc文件 除此之外,你可以创建.psqlrc文件来定义命令行环境和快捷命令。 vim ~.psqlrc \set activeprocess 'select pid,usename,query from pg_stat_activity where state = ''active'';' 然后你就可以在命令行中调用它了 postgres=# :activeprocess pid | usename | query ---------+----------+------------------------------------------------------------------------ 2942409 | postgres | select pid,usename,query from pg_stat_activity where state = 'active'; 类似的,你可以在.psqlrc中定义输出配置,常用的元信息查询等等。 psql用法_批量执行查询结果 作为DBA,有些操作需要拼接元信息形成新的操作命令,然后再进行操作。通常我们只是复制这些结果,再进行粘贴执行一次操作。在psql中,被\gexec命令简化。把查询结果当成 SQL 执行,做批量 DDL 神器。 -- 批量重建 bloated 索引(只是示例) SELECT format('REINDEX INDEX %I.%I;', schemaname, indexrelname) FROM pg_stat_all_indexes WHERE idx_scan=0 \gexec psql用法_监控 我们直到linux中有watch命令进行定义监控,一样的,pg也有这样的watch命令。
Postgresql数据库的安装 仓库安装 仓库安装可以参考官方的download页面。在这里可以选择操作系统,需要安装的Postgresql版本号,快捷的进行安装和部署。 如果需要离线安装,那么推荐首先进行创建离线仓库,包括base,update,epel,pgdg等等的分类仓库创建,方便日后升级和扩展。如果是容器部署可以参考Postgres offical image。 大型项目除了数据库本身,还需要安装数据库周边的一些软件,依赖复杂度高,所以推荐仓库安装。
蓝象十日谈·第01日_数据库的发展历程 数据库的发展历程 滚滚长江东逝水,浪花淘尽英雄。数据库系统的发展历程波澜壮阔,血脉丛横交错。每个年代都有各自的佼佼者和里程碑。主线脉络我这里分为8条: IBM 系统 R → DB2 1970s 的 System R 奠定了 SQL 与商用 RDBMS 的起点,随后发展为 DB2,并衍生出多条企业级分支(如 OS/400、Mainframe 等)。 Ingres/POSTGRES → PostgreSQL 伯克利 Ingres 一脉演化到 POSTGRES、Postgres95,最终成为 PostgreSQL。这条线上你会看到:
网卡绑定 网络基础知识 这部分是前置扫盲环节,如果网络基础,可以跳过直接下面的内容。 七层网络协议 OSI 七层网络模型往往是我们进行理论学习的开门课程,但是工程上往往采用 TCP/IP 4/5 层: 应用层(L7) ≈ OSI(7/6/5) 的合体 传输层(L4) = TCP/UDP 网络层(L3) = IP/ICMP/路由 网络接口/链路层(L2+L1)
数据库事务 事务通过把系统从一个一致态转到另一个一致态来守住一致性 – Jim Gray The Transaction Concept:Virtues and Limitations 什么是事务 事务的概念,高度概括如下: 事务是一个作为单个逻辑单元执行的有限操作序列,保证把数据库从一致状态转换到一致状态;要么全部生效(持久),要么全部撤销(原子),并在并发下保持隔离。
Rocky Linux 8 安装 MySQL 5.7(仓库安装)SOP 说明:MySQL 5.7 已 EOL,仅在确有兼容需求时短期使用。官方 EL8 仓库已不再提供 5.7,我们采用创建 repo,指向官方 EL7 的 5.7 仓库的方式在 Rocky 8 安装(依旧属于“仓库安装”)。 本 SOP 默认你以 root 或 sudo 执行。 0. 环境确认与准备 # 查看系统版本(确保是 Rocky Linux 8) cat /etc/os-release uname -r # 基础更新与工具(含 repo 管理插件) dnf -y update dnf -y install dnf-plugins-core # Rocky8 某些依赖在 CRB/PowerTools dnf config-manager --set-enabled crb || true dnf config-manager --set-enabled powertools || true # 如系统中已安装 MariaDB/MySQL,请先备份数据! 1. 关闭系统自带 mysql 模块(避免遮蔽) dnf -y module reset mysql dnf -y module disable mysql 2. 创建 MySQL 5.7 仓库文件(指向官方 EL7 仓库) tee /etc/yum.repos.d/mysql57-community.repo >/dev/null <<'EOF' [mysql57-community] name=MySQL 5.7 Community Server (EL7 packages) baseurl=https://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=1 gpgcheck=1 # 同时声明多把官方公钥,避免“钥匙不匹配” gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 # 避免被模块化遮蔽 module_hotfixes=1 EOF # 导入官方 GPG Key(含旧钥匙与 2022/2023 新钥匙) rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 # 刷新缓存 dnf clean all rm -rf /var/cache/dnf dnf -y makecache 3. 预装依赖(解决 .so.5 兼容、网络工具等) # Rocky8 提供 ncurses-compat-libs(提供 libncurses.so.5 / libtinfo.so.5) dnf -y install ncurses-compat-libs net-tools libaio numactl-libs perl perl-Data-Dumper 若提示找不到 ncurses-compat-libs,请先确认 crb/powertools 已启用;仍无则 dnf provides '*/libtinfo.so.5' 查看何者提供。
电感器 The Inductor 电感器(Inductor)是一种无源电气元件,由一圈线圈组成,利用电流通过线圈时产生的电—磁相互作用来实现功能。 在本教程中,我们将看到,电感器是用于向电路中引入电感量(inductance)的元件,能够抵抗电流变化(包括大小和方向)。即便是一段直导线,也会具有一定的电感。
线圈的电感 Inductance of a Coil 电感(Inductance)是用来描述元件抵抗电流变化的特性名称,即使是一段直导线也会具有一定的电感。 线圈的电感指的是该感性线圈为了抵抗电流变化而呈现出的电气特性。因此,电感只在电路中电流发生变化时才存在。 由于线圈内部磁场的变化,电感器会在自身内部产生自感电动势(emf)。在同一电路中,当电流变化时感应电动势也在该电路内产生,这种现象称为自感(Self-induction),通常用符号 L 表示,有时也称为反电动势(back-emf),因为其极性与外加电压方向相反。 当电动势感应到处于同一磁场内的相邻元件中时,这种现象称为互感(Mutual-induction),用符号 M 表示。互感是变压器、电动机、继电器等设备的基本工作原理。自感是互感的一种特例,由于它产生于单一的独立电路中,我们通常将自感简称为电感。