Repository navigation
Expand file tree
/
Copy pathcontent.json
More file actions
1 lines (1 loc) · 30.5 KB
/
Copy pathcontent.json
File metadata and controls
1 lines (1 loc) · 30.5 KB
1
{"pages":[{"title":"","text":"404 您访问的资源不存在,正在前往网站首页... setTimeout(() => { window.location.href = \"https://blog.adream.win/\"; }, 1000);","link":"/404.html"},{"title":"About me","text":"独立人格 自由思想 转发投币点赞了解一下?☞ ☞ ☞ Bilibili /* scale 用来实现宽高等比例 */ .scale { width: 100%; padding-bottom: 56.25%; height: 0; position: relative; } /* item 用来放置全部的子元素 */ .item { width: 100%; height: 100%; position: absolute; } 中国科学院大学 人工智能学院 硕士 在读 自诩是一个会技术的产品。 那些疯狂到以为自己能够改变世界的人,才能真正改变世界。我一定会倒在让这个世界更加美好的路上。 实习经历 计算所泛在研究中心 BDA 投资有限公司技术部 北京长亭科技安全策略部","link":"/about/index.html"}],"posts":[{"title":"那些年我写的现代诗","text":"记录和整理我写的现代诗 流年体警告!!! 慎入!!! 章一篇一 恨不能与你早相遇那样便可早相知 正好赶上三月的樱花风暖云疏 天气晴好 可终究我还是错过了那个大雪纷飞的季节我还在寻找机会与你接近却已经有人为你嘘寒问暖 篇二 崇法寺塔 高三,转移去了老校区,教室窗户外面就是两千多年前的古塔 我见证过繁华我经历过战火也许是这些原因我被永久的保护了起来这就是我的宿命像墓碑一样的伫立着 风吹日晒就换上新的琉璃岁月流逝就撑起铁的支架 可笑的世人啊你们不知自从那持灯的僧人走后我体内剩下的只是千百座没有温度的佛像 篇三 暗恋一个人,即便不能告白,也别藏得太深吧 我把所有的爱慕埋藏在难以触及的心底好让在遇见你的时候不漏声色 我把所有的思念放置在无人翻阅的诗集好让在没有你的日子笑靥如初 后来把自己也藏了起来藏在拥挤的人群藏入忙碌的日子 篇四想你不需要理由也不分季候 想你不是从别离开始在第一次遇见你之后失眠了一整个夜一整夜的风和雨风里雨里都是你 篇五 缘由是如何清澈的月光才能刺痛温柔的心是如何呜咽地笛声才能触动眼中的泪 今夜月 清如水此间笛 声如斯 可千万别别把这误以为我悲伤的缘由 章二 求打醒章节 篇一 快,来个人,打醒他 假如上天有意为你我安排一段姻缘我便不再担心不再着急只等你来爱我 然后执子之手到天荒地老 篇二 画师 接着打,往死里打 只希望我的世界是一片空白的画布任我去着色添笔 不需要昂贵的画布也不渴求绚丽的色彩只要一杆画笔我可以在篱墙下在田间阡陌在世界上的任何一个容得下你我的角落把你画在我的怀中把我画进你的心里 篇三 不要轻易承诺吧 如果你还不懂这些苦涩的诗句那就再等上些时日 等花开花落四季轮回 如果你还不懂我有多爱你那就再等上些时日 等海枯石烂誓言未改 章三篇一 天各一方 海南的气候让我难以忍受,希望你北方快乐 我南下你北上 南下有骄阳北方应有花香 篇二 a: 你喜欢我吗,b: 你能别问了吗 喜欢 不去问夏夜有多短不去问冬夜有多长春风还会如期拂面秋雨还会如约连绵 你也不必反复追问我会待你眉眼如初 篇三好多天没能想起你这南方九十度的阳光吞噬了所有的喜怒哀乐只剩下唯有的动作从一个眉梢到另一个眉梢不经意的重复就像以前不经意的想起你 我喜欢北方的冬天那可以让我想起温暖想起温暖就会想起你我喜欢那萧萧落木那可以让我感到孤独感到孤独也会想起你 我还喜欢北方的你 篇四夜无言只将天地笼罩 我是一颗北极星悄悄来到你的夜空怕惊醒你的美梦 你是否也会深夜凭栏斗转星移我还在那里 篇五 导演你说什么就是什么天晴了,又雨了在一起便在一起说别离就是别离 后来你让我哭我也比谁哭的都卖力 篇六 雨夹雪 到家的时候下了一场雨夹雪。希望两情相悦的人都能克服困难,终成眷属吧 你是我的前生我是你的来世 今夜天空飘落的是一场雨夹雪 章四篇一 诗人竟厌恶了这安逸的生活想要背起行囊做一个诗人 流浪 流浪去千里外的渔场从港口出发借北吹的风要两天航程父亲就在那里风吹雨打半辈子 我是来感受海的孤独风的刺骨一会就走 篇二 很小的时候,贪玩,每次周日,就开着钨丝灯,趴在椅子上赶作业 关于那段岁月的一切都值得珍藏 在那个年代里有灯,昏黄的要把傍晚的时间赶回来我趴在椅子上头也不抬 篇三 小学的时候,老师经常教育我们要珍惜时间,例子就是时钟走过就转不回去… 再也回不去了那年夏天月季盛开了一个季节三叶草换成了石板路蜜蜂不再飞来 再也回不去的呀是教室里的挂钟老师曾经反复强调 篇四 清明 高一的时候,清明节要出去玩,就在迈出家门的前一步,月考成绩出来了。。。高中再无清明节 亏欠故乡一个清明那年许好的承诺待到闲时一定要将清明的春色踏遍 那年我就从故乡飞了出去飞到了一个四季如夏的南方花草不是故乡的树木不是故乡的就连从北方吹来的风也变了味道 故乡的清明啊,再遇你时你若还是识得我请迎我以明媚春光请迎我以纷纷细雨 篇五 远行 16 年春节,一个人坐火车回海南,路上发生的事 醒来的第一句竟是家乡话半路上来的师傅没能听懂 原来我已离家千万里 章五篇一 诗三百 诗三百新解 你如星子划过美丽了我的回忆 别离之后我用三百诗篇洒满了夏夜演绎着你的昔日我的昨天 篇二 高二,春天,倒春寒,学校的花大面积阵亡 那两天春风渐暖暖得让人醉醉到花红柳也绿绿了千里河山山上有翠柳青枝枝头有莺歌燕舞 东风易变变料峭春寒寒风过处处处花残 篇三 同上篇 在春风刚来的日子里暖风吹得杨柳绿 百花开温柔的抚摸着荒凉了一个季节的田野村前刚化冻的河边野鸭正成群游过 可等时令一变都跟着变了模样风不再温柔光不再明媚 只是可怜胸膛这颗不分季候的心还那般炽热 篇四 同窗 大一,同窗换了学校复读,梦里在母校碰到了他 不应该遇见你的你我都已经离去 是你意外的出现还是我忽然地闯入 这次不是命运的安排是我一个小小的梦 篇五 这篇太矫情了。。。 不愿意醉去怕遗漏你温柔的话语醒时只剩满天风和雨 不愿意哭泣怕模糊我最后的记忆今日你是如此的美丽 亭外柳花年年枝无数不愿折柳相赠远行人怕柳色青青不敌关山万里失颜色 来生怎舍得与你相遇怕山盟海誓不堪世事变易伤别离 章六篇一 我很后悔去海南读书,有些遗憾此生都难以弥补 以前想看的海,看一次就够了以前想走的山,走一次就累了舅舅家里的无花果熟了没庭院里不知名的植物还没有开花 儿时多少的欢乐都交付给了昨日那个从外面捎来奇异的水果的人也走了没有人再给我带来那伴随我长大的玩具 知道到了天涯海角的距离曾经的那个男儿志在四方现在不想去远的地方闯荡 篇二你不知道有个人还在为你伤心你不知道有个人还在为你哭泣 岁月轮回 日夜更替千呼万唤也唤不回你 想让风吹尽思念想让雪掩埋回忆最想让时光倒流","link":"/article/poems/"},{"title":"PostgreSQL 迁移数据","text":"记录 postgresql 数据库迁移中遇见的一个问题 web服务使用的腾讯云 serverless 服务,在重新部署的过程中提示: 1警告:你正在使用Serverless Component的beta测试版本。请使用正式的版本以获得更多的特性,详情请见:https://github.com/serverless/components/blob/master/README.cn.md 经过查询发现,自己使用的 component 还是 v1 版本,v2 版本已经发布,在升级 postgresql 的过程中需要手动迁移数据库。 数据库备份1pg_dump -U username -h hostname -p port databasename -f filename.sql 数据库导入1psql -U username -h hostname -d desintationdb -p port -f filename.sql 在导入数据库之后,发现 web 服务不可用且 python manage.py migrate 也报错: 12345# error 1psycopg2.errors.UndefinedTable: relation "user_wxmodel" does not exist...# error 2psycopg2.errors.InvalidSchemaName: no schema has been selected to create in... 解决在 pg_dump 备份文件中,注释掉下面这行即可: 1SELECT pg_catalog.set_config('search_path', '', false); 原因no schema has been selected to create in … error 参考 1","link":"/bug/PostgreSQL%E8%BF%81%E7%A7%BB%E6%95%B0%E6%8D%AE/"},{"title":"城市异常事件检测","text":"","link":"/paper/%E5%9F%8E%E5%B8%82%E5%BC%82%E5%B8%B8%E4%BA%8B%E4%BB%B6%E6%A3%80%E6%B5%8B/"},{"title":"UCAS Affair Scripts","text":"项目地址 开发/收集 中国科学院大学 各种事务的自动化脚本 已有脚本: 选课 监听成绩 期待贡献,添加更多有趣的脚本,kill TodoList item Warning: 由于 选课系统 只能单点登录,如果同时运行两个脚本,或者在运行脚本的时候登陆网页端,他们之前会争抢会话。 脚本默认在会话失效后再次自动获取,所以在刷课和监听成绩的过程中,如果您需要浏览选课系统的网页端,需要先暂停脚本。 script12kill -STOP $pid # suspendkill -CONT $pid # resume UsageInitializationPull project: script1git clone https://github.com/zhangxu3486432/UCAS-Affair-Scripts.git Enter the working directory: script1cd UCAS-Affair-Scripts Install dependency: script1pip3 install -r deploy/requirements.txt Configuration Set in the settings.py Set http://sep.ucas.ac.cn/ UserName and PassWord 12USERNAME = ''PASSWORD = '' Login In the off-campus network login need to fill in the Verification Code. First login to save cookies in sep.cookie, so that you can facilitate deployment in the server. script1python3 login.py The Verification Code picture is saved in verification.png, open the picture identification key and fill it in terminal. As you can see, this Verification Code is 7351. Fill the 7351 in terminal and press enter. RUN take-courses Set the courses which you want to take Examples: 1COURSES = ['自然语言处理', '机器人智能控制', '积极心理学'] Fill in the college to which the course you choose belongs Examples: 1COLLEGES = ['人工智能学院', '心理学系'] Run script1python3 take_courses.py Run monitor_grades Set email info if you want to monitor your grads, you need to set it 1234SEND_EMAIL = ''SEND_EMAIL_PWD = ''RECEIVE_EMAIL = '' Run script1python3 monitor_grades.py TodoList Test and adapt to more python versions Shuttle Bus Reservation Build Docker Image Automatic Identification Verification Code","link":"/tutorial/UCAS-Affair-Scripts/"},{"title":"The tutorial of Hexo and Icarus theme","text":"My Customzhangxu3486432/hexo-theme-icarus compare changes fix back-to-top bug add some icons add 163 music distinguish between thumbnail and cover modify profile layout add dropdown for toc … Quick StartInstall1npm install -g hexo SetupCreate Blog Project12345hexo init [blog_name]cd [blog_name]git initgit add .git commit -m 'init blog' Install Theme1git submodule add https://github.com/ppoffice/hexo-theme-icarus.git themes/icarus Run1hexo s Deploy1234567891011# Remove generated files and cache.hexo clean# Generate static files.hexo generate# Deploy your website.hexo deploy# in shorthexo c && hexo g && hexo g Command12345678910111213141516Usage: hexo <command>Commands: clean Remove generated files and cache. config Get or set configurations. deploy Deploy your website. generate Generate static files. help Get help on a command. init Create a new Hexo folder. list List the information of the site migrate Migrate your site from other system to Hexo. new Create a new post. publish Moves a draft post from _drafts to _posts folder. render Render files with renderer plugins. server Start the server. version Display version information. ConfigGet or set configurations. 123Arguments: name Setting name. Leave it blank if you want to show all configurations. value New value of a setting. Leave it blank if you just want to show a single configuration. DeployDeploy your website. 123Options: --setup Setup without deployment -g, --generate Generate before deployment GenerateGenerate static files. 123456Options: -b, --bail Raise an error if any unhandled exception is thrown during generation -c, --concurrency Maximum number of files to be generated in parallel. Default is infinity -d, --deploy Deploy after generated -f, --force Force regenerate -w, --watch Watch file changes InitCreate a new Hexo folder at the specified path or the current directory. 123456Arguments: destination Folder path. Initialize in current folder if not specifiedOptions: --no-clone Copy files instead of cloning from GitHub --no-install Skip npm install ListList the information of the site. 12Arguments: type Available types: page, post, route, tag, category MigrateMigrate your site from other system to Hexo. 12Arguments: type Migrator type. NewCreate a new post. 12345678Arguments: layout Post layout. Use post, page, draft or whatever you want. title Post title. Wrap it with quotations to escape.Options: -p, --path Post path. Customize the path of the post. -r, --replace Replace the current post if existed. -s, --slug Post slug. Customize the URL of the post. PublishMoves a draft post from _drafts to _posts folder. 123Arguments: filename Draft filename. "hello-world" for example. layout Post layout. Use post, page, draft or whatever you want. RenderRender files with renderer plugins (e.g. Markdown) and save them at the specified path. 1234Options: --engine Specify render engine --output Output destination. Result will be printed in the terminal if the output destination is not set. --pretty Prettify JSON output ServerStart the server and watch for file changes. 123456Options: -i, --ip Override the default server IP. Bind to all IP address by default. -l, --log [format] Enable logger. Override log format. -o, --open Immediately open the server url in your default web browser. -p, --port Override the default port. -s, --static Only serve static files. Global Options1234567Global Options: --config Specify config file instead of using _config.yml --cwd Specify the CWD --debug Display all verbose messages in the terminal --draft Display draft posts --safe Disable all plugins and scripts --silent Hide output on console The directory structure12345678910111213├── _config.yml├── scaffolds│ ├── draft.md│ ├── page.md│ └── post.md├── source│ ├── _data│ ├── _drafts│ ├── _posts│ └── static└── themes ├── icarus └── landscape Configuration and Othershexo document icarus document Custom domaincreate a file named CNAME, fill blog.adream.win in it: 1echo blog.adream.win > CNAME 1url: blog.adream.win github will generate certificates for your domain within 24 hours and then you can access blog.adream.win with https. IssueNeed to change the github OAuth Apps callback address after customizing the domain name, if you ever use it: gitalk cannot create issue SEOGoogleGoogle Search Console Baidu[Baidu]","link":"/tutorial/The-tutorial-of-hexo-and-Icarus-theme/"},{"title":"迁移 MySQL 数据到 psql","text":"若干年前接了一个自家学院的外包,给我们学院开发了一个学生管理系统,其实就是在 django xadmin 基础之上做了下定制。 一直跑在我的阿里云服务器上,前两天学院老师联系我说系统无法登陆了。。。嗯,服务器到期了。。。 目前我们团队的小程序后端都是部署在腾讯云的 Serverless 之上,因为有免费额度,而且真的是一个技术方向的潮流和趋势,但是 Serverless 数据库只提供 psql,之前是使用 mysql,需要进行迁移。之前已经写过两篇数据库备份相关的文章了,今天就来讲一下数据迁移吧。 Serverless 部署的文章下篇来写! 备份 Mysql 数据123python manage.py dumpdata contenttypes --indent=4 --natural-foreign > contenttype.jsonpython manage.py dumpdata --exclude contenttypes --indent=4 --natural-foreign > everything_else.json 创建 Postgresql 数据库1python manage.py migrate 清理创建数据库时产生的内容1python manage.py sqlflush | ./manage.py dbshell 导入数据12python manage.py loaddata contenttype.jsonpython manage.py loaddata everything_else.json Done! 参考migrate mysql to psql","link":"/tutorial/django-migrate-mysql-to-psql/"},{"title":"Docker 设置时区","text":"简介Docker 默认时区是协调世界时,又称世界标准时间,简称 UTC 中国大陆、香港、澳门、台湾、蒙古国、新加坡、马来西亚、菲律宾、澳洲西部的时间与 UTC 的时差均为 +8,也就是 UTC+8。 中国标准时间又称为 CST(China Standard Time) 查看时区可以使用 date 命令查看时区信息 1234567➜ date# UTC 时间Sat Feb 21 16:15:16 UTC 2020➜ date# CST 时间Sat Feb 22 00:15:16 CST 2020 更改时区根据应用方式的不同修改 Docker 时区可分为三种方式 docker-compose12environment: TZ: Asia/Shanghai Dockerfile1234567891011# 需要安装 tzdata 依赖RUN apk add --no-cache tzdataENV TZ Asia/Shanghai# or# 若容器内不存在 /usr/share/zoneinfo,则需要创建这个目录RUN apk add --no-cache tzdata \\ && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \\ && echo "Asia/Shanghai" > /etc/timezoneENV TZ Asia/Shanghai docker run12# 容器的时区和主机的时区相同docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -it [image name] sh","link":"/tutorial/docker-timezone/"},{"title":"elasticsearch 调优","text":"记录 elasticsearch 的使用及调优 max_map_count虚拟机最多可以使用的内存映射数量,每个映射空间的大小可能是 64KB、256KB等等,大小并不固定。 默认值为 65536,对于 elasticsearch 来说太少了,推荐增大到 262144 1sysctl -w vm.max_map_count=262144 上述方法在虚拟机重启后将失效,可以在 /etc/sysctl.conf 追加定义 1vm.max_map_count=262144 文件夹权限问题Error info 12java.lang.IllegalStateException: Failed to create node environmentjava.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes 改编权限 1sudo chown -R 1000:1000 elastic 内存禁用交换内存交换内存会导致性能严重下降 1bootstrap.memory_lock=true 也可以在操作系统级别禁用交换内存,或者降低 swappiness 的值,这个值决定操作系统交换内存的频率。 1vm.swappiness = 1 //swappiness 设置为 1 比设置为 0 要好,因为在一些内核版本 swappiness 设置为 0 会触发系统 OOM-killer。 JVM 内存空间elasticsearch 默认会分配 1GB 的内存空间,但是在生产环境中需要根据情况进行增加。 设置ES的内存堆有三种办法 通过 ES_HEAP_SIZE 来设置 min、max,此时两个值相等[推荐] 通过 ES_MIN_MEM 和 ES_MAX_MEM 直接设置 使用 ES_JAVA_OPTS 来设置,ES_JAVA_OPTS=”-Xms=512M -Xmx=512M” 注意:如果值被同时设置时,优先级方法3 > 方法1 > 方法2 设置原则 Xmx 和 Xms 设置为相等的值,防止程序在运行时改变堆内存大小,这是一个很耗系统资源的过程。 不超过物理内存的 50%,elasticsearch 还需要用于 JVM heap 之外的其他目的; 不超过启用 compressed object pointers 的阀值,确切的阀值是不同的,但是接近 32GB,可以通过日志进行查看是否启用了 compressed object pointers:heap size [15.7gb], compressed ordinary object pointers [true],你可以在你的 JVM 设置里添加 -XX:+PrintFlagsFinal 用来验证 JVM 的临界值; 最好不要超过启用 zero-based compressed oops 的阀值,确切的阀值是不同的,但是对于大部分的系统来说 26GB 是一个安全的值;可以在启动添加 JVM options -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode 显示是否启动了 zero-based compressed oops,启用:zero based Compressed Oops,未启用:Compressed Oops with base 假设你有个机器有 128 GB 的内存,你可以创建两个节点,每个节点内存分配不超过 32 GB。 也就是说不超过 64 GB 内存给 ES 的堆内存,剩下的超过 64 GB 的内存给 Lucene。 如果你选择这一种,你需要配置 cluster.routing.allocation.same_shard.host: true 。 这会防止同一个分片(shard)的主副本存在同一个物理机上(因为如果存在一个机器上,副本的高可用性就没有了)。 提高写入速度减少刷新频率减少刷新频率,降低潜在的写磁盘性能损耗,提高写入速度。 1234PUT /_all/_settings?preserve_existing=true{ "index.refresh_interval" : "600s"} replica 数目设置在 bulk 大量数据到ES集群的可以把副本数设置为0,在数据导入完成之后再设置为1或者你集群的适合的数目。 1234PUT /_all/_settings?pretty{ "index.number_of_replicas" : 0} 部署 调优 调优 写入性能优化","link":"/tutorial/elasticsearch/"},{"title":"Git","text":"记录常用的 git 操作 更换 remote 仓库12345678# 删除远程仓库 origin 是远程仓库的名字git remote remove origin# 配置远程仓库git remote add origin git@github.com:zhangxu3486432/hexo-theme-icarus.git# 建立与远程上游的跟踪并推送git push --set-upstream origin master git pull 和 git fetch 的区别git pull = git fetch + git merge/rebase 参考 1参考 2","link":"/tutorial/git/"},{"title":"postgresql 备份与恢复","text":"目前数据库有 7 百多万条数据,要是哪天数据库或者服务器炸了我也就凉透了,还是赶紧备份下吧 由于数据量非常大,使用 pg_dump 和 psql 进行导入导出是不现实的,需要使用增量备份。 关于 postgresql 的备份工具,大家可以去 awesome-postgres 这个项目查看,我选用的是 wal-g 这个工具,它可以无缝对接亚马逊 S3、Google Cloud 以及 MinIO 等对象存储服务,这也是我选用这个工具的原因,等以后有钱了就无缝上云。。。目前是使用的自建的 minio 对象存储服务。 安装 minio我是使用的 docker-compose,其他的安装方式请参考 官方文档 123456789101112131415161718192021222324version: '3'services: minio: image: minio/minio:RELEASE.2020-07-27T18-37-02Z container_name: minio volumes: - minio-data:/minio-data ports: - "9000:9000" environment: MINIO_ACCESS_KEY: youkey MINIO_SECRET_KEY: yourpassword command: server /minio-data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 volumes: minio-data: 创建 bucket创建 minio 中用于存放数据库备份存储桶。 使用 mc(minio client) 创建 1mc mb local/pgsqlbkp # local 根据实际情况替换成 minio 的别名 登录 minio web 管理端,通过图形界面创建 安装 wal-g可以直接在 Releases tab 下载二进制文件。 12tar -zxvf wal-g.linux-amd64.tar.gzmv wal-g /usr/local/bin/ 安装 postgresql为了安全起见,需要将数据挂载在宿主机上,进行持久化 1- ./data/postgresql/data:/var/lib/postgresql/data 在容器内,需要使用 wal-g 备份 postgresql 产生的 wal 文件,所以也需要将之前在宿主机安装的 wal-g 程序挂载到容器内 1- /usr/local/bin/wal-g:/usr/local/bin/wal-g 配置 postgresql wal_level archive 或更高级别 archive_mode on 开启归档模式 archive_command 归档时触发的命令或脚本 archive_timeout 可以理解为超过指定时间强制执行 select pg_switch_wal(); 场景,数据库不是很活跃,数据库wal日志产生的过慢时。如果这个值没有单位,默认将会是秒。 restore_command 恢复时触发的命令或脚本 recovery_target_time 需要恢复到的时间点 归档触发条件说明: 手动执行 select pg_switch_wal(); WAL 日志写满后触发归档 WAL 日志文件,默认为 16MB; 如果设置 archive_timeout,超时触发。 完成的配置 12345678910111213141516171819202122232425version: '3'services: postgres: image: postgres container_name: postgres restart: always environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - TZ=Asia/Shanghai - WALG_S3_PREFIX=s3://pgsqlbkp/ - AWS_ACCESS_KEY_ID=youak - AWS_SECRET_ACCESS_KEY=yourpassword - AWS_ENDPOINT=http://ip:9000 - AWS_S3_FORCE_PATH_STYLE=true command: ["postgres", "-c", "wal_level=replica", "-c", "archive_mode=on", "-c", "archive_command=wal-g wal-push %p", "-c", "restore_command=wal-g wal-fetch %f %p", "-c", "recovery_target_time=2021-01-01 00:00:00"] volumes: - ./data/postgresql/data:/var/lib/postgresql/data - /usr/local/bin/wal-g:/usr/local/bin/wal-g ports: - 5432:5432 备份经过上面的设置,在 postgresql 启动以后,就开始不断地向 minio 服务器备份 wal 归档文件,另外我们还需要备份数据库,恢复的逻辑是这样的: 1时间点 A 的数据 = 恢复(时间点 B 的数据库,时间点 B 到 A 之间的 wal 文件) 首先设置环境变量,在 postgresql 容器中已经被设置过了,被用来备份 wal 文件,在宿主机上还需要重新设置一遍,用来备份数据库 1234567891011# wal-g.env# source wal-g.envexport PGDATA=/path/postgresql/data # postgresql 数据存放的路径export WALG_S3_PREFIX="s3://pgsqlbkp/"export PGPORT=5432export PGUSER=postgresexport PGPASSWORD=postgresexport AWS_ACCESS_KEY_ID=youakexport AWS_SECRET_ACCESS_KEY=yourpasswordexport AWS_ENDPOINT="http://ip:9000"export AWS_S3_FORCE_PATH_STYLE="true" 备份 1wal-g backup-push $PGDATA 因为日志在一定的体积之后才会触发归档日志,备份完之后需要做一次 WAL 切换,保证最新的WAL日志归档到归档目录 1select pg_switch_wal(); 恢复将之前的数据库清空,模拟数据库损坏 之前在网上看过很多教程,需要在 postgresql 地址中创建 recovery.conf 123restore_command = 'wal-g wal-fetch %f %p'standby_mode = onrecovery_target_time = '2222-11-11 00:00:00' 但是在 postgresql 12 之后,这个文件就被取消了,参见,如果在 postgresql 出现 recovery.conf 文件,pg 就会报错 1FATAL: using recovery command file "recovery.conf" is not supported 取而代之的是需要创建在原来的位置创建两个标识文件,来表示恢复数据库和 standby_mode standby_mode为off时,应用完所有日志后,自动退出恢复,进入运行状态。standby_mode为on时,应用完所有日志后,恢复流程不会退出,持续读取可用日志(来自于归档日志文件或流复制),当收到pg_ctl工具发出的promote命令后,才退出恢复流程,进入运行状态。 recovery.signal standby.signal restore_command 和 recovery_target_time 被合并在了 postgresql.conf,在之前的 postgresql yaml 里面已经被定义 ↑ 查看 minio 中的备份列表 1wal-g backup-list --pretty 123456+---+-------------------------------+-----------------------------------+--------------------------+| # | NAME | LAST MODIFIED | WAL SEGMENT BACKUP START |+---+-------------------------------+-----------------------------------+--------------------------+| 0 | base_000000010000000000000006 | Wednesday, 29-Jul-20 16:23:22 UTC | 000000010000000000000006 || 1 | base_000000010000000000000004 | Wednesday, 29-Jul-20 16:22:49 UTC | 000000010000000000000004 |+---+-------------------------------+-----------------------------------+--------------------------+ 从远程下面备份到 postgresql 文件夹 123456# wal-g backup-fetch destination_directory backup_namewal-g backup-fetch $PGDATA base_000000010000000000000006# 或者wal-g backup-fetch $PGDATA LATEST 在 postgresql 文件夹文件夹下创建 recovery.signal(如果使用standby mode,需要创建 standby.signal) 12touch $PGDATA/recovery.signal# touch $PGDATA/standby.signal 然后等待恢复即可 1232020-07-30 23:41:18.011 CST [25] LOG: restored log file "00000003000000000000000D" from archive2020-07-30 23:41:18.152 CST [25] LOG: redo starts at 0/D0000602020-07-30 23:41:18.790 CST [1] LOG: database system is ready to accept connections 参考 参考 参考 参考","link":"/tutorial/postgresql-backup/"}],"tags":[{"name":"现代诗","slug":"现代诗","link":"/tags/%E7%8E%B0%E4%BB%A3%E8%AF%97/"},{"name":"数据库","slug":"数据库","link":"/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"},{"name":"PostgreSQL","slug":"PostgreSQL","link":"/tags/PostgreSQL/"},{"name":"Bug","slug":"Bug","link":"/tags/Bug/"},{"name":"论文","slug":"论文","link":"/tags/%E8%AE%BA%E6%96%87/"},{"name":"异常检测","slug":"异常检测","link":"/tags/%E5%BC%82%E5%B8%B8%E6%A3%80%E6%B5%8B/"},{"name":"综述","slug":"综述","link":"/tags/%E7%BB%BC%E8%BF%B0/"},{"name":"城市计算","slug":"城市计算","link":"/tags/%E5%9F%8E%E5%B8%82%E8%AE%A1%E7%AE%97/"},{"name":"中国科学院大学","slug":"中国科学院大学","link":"/tags/%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E9%99%A2%E5%A4%A7%E5%AD%A6/"},{"name":"icarus","slug":"icarus","link":"/tags/icarus/"},{"name":"blog","slug":"blog","link":"/tags/blog/"},{"name":"tutorial","slug":"tutorial","link":"/tags/tutorial/"},{"name":"mysql","slug":"mysql","link":"/tags/mysql/"},{"name":"postgresql","slug":"postgresql","link":"/tags/postgresql/"},{"name":"django","slug":"django","link":"/tags/django/"},{"name":"Docker","slug":"Docker","link":"/tags/Docker/"},{"name":"Linux","slug":"Linux","link":"/tags/Linux/"},{"name":"git","slug":"git","link":"/tags/git/"},{"name":"备份","slug":"备份","link":"/tags/%E5%A4%87%E4%BB%BD/"},{"name":"对象存储","slug":"对象存储","link":"/tags/%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8/"},{"name":"wal","slug":"wal","link":"/tags/wal/"},{"name":"wal-g","slug":"wal-g","link":"/tags/wal-g/"}],"categories":[{"name":"杂记","slug":"杂记","link":"/categories/%E6%9D%82%E8%AE%B0/"},{"name":"数据库","slug":"数据库","link":"/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/"},{"name":"论文","slug":"论文","link":"/categories/%E8%AE%BA%E6%96%87/"},{"name":"开源项目","slug":"开源项目","link":"/categories/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"},{"name":"Icarus","slug":"Icarus","link":"/categories/Icarus/"},{"name":"Docker","slug":"Docker","link":"/categories/Docker/"},{"name":"elasticsearch","slug":"elasticsearch","link":"/categories/elasticsearch/"},{"name":"git","slug":"git","link":"/categories/git/"},{"name":"城市计算","slug":"论文/城市计算","link":"/categories/%E8%AE%BA%E6%96%87/%E5%9F%8E%E5%B8%82%E8%AE%A1%E7%AE%97/"}]}