恢复数据库快照xb文件到新实例

背景 背景就是我把线上某张表的某个字段给清空了。用的是腾讯云的数据库实例,运维配置的快照是每天早上备份一次,因此可以通过快照文件恢复数据。直接恢复到线上实例是不现实的,所以想法是将快照恢复到本地实例,然后用脚本/工具把数据导出来,再写入线上实例。当时恢复过程比较曲折,这里记录下比较好的操作步骤。 获取xb文件 从云服务商或你自行备份的xb文件中获取。腾讯云 这里 可找到备份列表 安装xbstream和qpress工具 腾讯云使用qpress压缩文件,再通过xbsteam打包为xb文件。[参考腾讯云文章] 安装xbstream 下载并安装 XtraBackup 工具。 下载地址请参见 Percona XtraBackup 官网,请选择 Percona XtraBackup 2.4.6 及以上的版本,安装介绍请参见 Percona XtraBackup 2.4。 支持的实例版本:MySQL 5.5、5.6、5.7 高可用版和金融版。 启用数据加密功能的实例,不支持使用物理备份恢复数据库。 我使用的是mac,使用brew进行安装 brew install percona-xtrabackup 安装qpress 从quicklz下载编译好的二进制文件。 我的mac无法直接使用linux的可执行文件,所以从上面网站下载源码,编译安装。 mac编译qpress时报错 qpress.cpp:1040:18: error: use of undeclared identifier 'isatty' tty_stderr = isatty(fileno(stderr)); ^ 1 error generated. make: *** [g++] Error 1 qpress.cpp 添加头文件 #include <unistd.h> 重新编译成功。将编译好的qpress拷贝到 /usr/local/bin 。必须放到该目录下,因为xbstream工具调用qpress是用的绝对路径(为啥这样设计 ̄□ ̄||) 对xb文件进行解包&解压缩 xbstream -x -C /tmp/新建的目录 < ~/你的xb文件.xb # 使用 xbstream 命令将备份文件解包到目标目录 xtrabackup --decompress --target-dir=/tmp/新建的目录 # 将目标目录下所有以.qp结尾的文件都解压出来 将解压出来的frm、ibd文件附到本地mysql实例 腾讯云的方法 腾讯云文档的方法是起一个mysqld_safe实例将data配置为刚刚那个新建的目录 ...

2020-04-29 · 1 分钟 · 147 字

fish shell切换到zsh

fish shell 想来用了也3年多了,大部分时间并不是在用fish shell的语法特性,而是觉得自带的主题好看,以及自动补全功能。当时挑选 xx shell时还网上做了功课,也在zsh和fish之间徘徊,后面看了阮一峰老师的推荐文章后就入坑了fish-shell 😂 今天装了一个软件,要用到alias别名,翻了翻~/.bash_profile,~/.config/fish/config.fish,发现按我之前的习惯,需要将别名配置在这两个文件(后者是fish shell启动时会读取的配置文件,相当于bash shell 的 bash_rc/profile)。为什么不统一放到bash_profile,然后在fish的config文件里source呢?因为fish shell不支持bash语法,而我的bash_profile有一些bash。 今天看了看我的bash_profile,看到了之前配置的autojump,因为fish不支持source该配置,导致换了fish后没用过了(不过貌似fish也有autojump插件?)。总之这算是一个契机吧,把fish换成支持bash语法的zsh,以后配置alias、exports就只配置在bash_profile就好了。 mac安装zsh mac出厂就自带了zsh,zsh --version 看到版本号应该蛮旧的,毕竟没更新过。重新装一个吧 安装zsh: brew install zsh zsh-completions 切换默认shell为zsh: chsh -s /bin/zsh 安装oh my zsh: sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" ps. 如果之前存在~/.zshrc文件,这次安装oh-my-zsh会将原来的文件备份为.zshrc.pre-oh-my-zsh,我将这个备份文件的配置追加到新的.zshrc里了。 主题 主题很重要,影响日常工作的心情和效率呢。 主题列表:https://github.com/ohmyzsh/ohmyzsh/wiki/themes 可以在上面列表挑选个你喜欢的,在 ~/.zshrc 配置ZSH_THEME="主题名"。当然,如果你是一个随心主义者,也可以将其设置为random,每次启动zsh都会随机一个主题。 安装自动建议插件 fish shell有个很好用的功能: 输入命令时,会用灰颜色提示你最近的命令,使用方向键↑可以翻看相同前缀的历史命令。 zsh也有类似的插件 git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions # 编辑 ~/.zshrc,若有其他插件,则括号里面用空格隔开 plugins=(zsh-autosuggestions) 移除不必要的别名 oh-my-zsh添加了很多git的别名,例如git -> g, git fetch -> gf,恰好我有其它命令和这些别名冲突。所以我在bash_profile将这俩别名干掉了 unalias g unalias gf 其他 zsh 默认支持一个叫 magic function 的功能,但这会给我带来困扰,粘贴url时会帮我自动转义,很烦。可以 vim ~/.zshrc , 将 这行的注释去掉:`DISABLE_MAGIC_FUNCTIONS=true 对了,最后还是安利下 autojump , 用的时间越长,越节省时间呢。

2020-04-11 · 1 分钟 · 83 字

Git使用技巧

git clean 之前的文章 git-clean exclude: 本地的.gitignore 有时候我们在本地创建的文件,不想提交到仓库时,会考虑用.gitignore。 但.gitignore文件本身往往是添加到版本控制的。为了不影响其他协作者。git提供了一个只对本地生效的规则文件 在项目的 .git/info/exclude 文件里编辑即可。规则用法与.gitignore一致。 统计两个commit之间的文件行数增改情况 将以下shell保存为diff_git_commit.sh git log $1...$2 --pretty=tformat: --numstat | grep -v 'src/proto_lib/' | grep -v 'test/' | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' - 用法:./diff_git_commit.sh commitId1 commitId2,当然你也可以用 ./diff_git_commit.sh tag1 tag2。 你可能注意到了上面的grep -v。我把不需要统计的文件目录排除了。你可以按需修改以上shell。 文件权限/格式相关(常用于需要与unix协作的win下) 以下命令需要设置为全局时,在 git config 后面加 –global 即可 git config core.filemode false # 忽略文件权限 git config core.autocrlf true # 将所有add到仓库的文本的结束符从crlf替换成lf(unix系统下将true替换成input) git config core.eol lf # 设置行结束符,不过当core.autocrlf设置为true/input时,该配置不生效 git config core.ignorecase false #区分大小写 分支相关 git push origin :branchName # 删除远程分支。其实就是把空分支push上去 git fetch origin --prune # 清除远程没有了,本地却还有的origin分支 Tag git tag -a tag名 -m "tag描述" # 创建tag git push origin tag名 # 推送指定tag到远程 git tag [-n] [--sort=creatordate] # 列出所有tag,并按创建时间排序 git fetch --tags # 从远程拉取所有tag 彻底将已删除的文件从版本库中清理掉 主要使用 git filter-branch ...

2020-03-18 · 1 分钟 · 147 字

qq互联100016错误

对于这个错误我也是很服气的。 用客户端传过来的 access token 换用户信息时报错:{“error”:100016,“error_description”:“access token check failed”} 请求的链接为:https://graph.qq.com/oauth2.0/me?access_token=我的token&unionid=1 官网文档说这是AccessToken过期了,或token不对。但我确信AccessToken是正确的。毕竟前后端的代码没有动过,唯一改变的是appid。 我鬼使神差地把unionid=1去掉后,正常响应了。我立马知道是因为该应用没有关联到开放平台,导致没有unionId,所以报错了。(评论区有同学也遇到这个问题,解决方案是:还要在【QQ互联】里面点击一下申请获取unionid权限,该权限申请后自动通过) 但….报的这个错也太不负责任了。想到这是qq互联,我立马原谅了他。毕竟他还是5年前那个qq互联呀。 ps: 5年前的吐槽 qq互联100010错误

2020-02-06 · 1 分钟 · 15 字

10分钟内跨账号迁移阿里云ECS实例

今天在阿里云购买了一个便宜的实例,打算把旧实例迁移到新实例。步骤很简单。 旧实例创建自定义镜像 控制台找到ECS实例,点击创建自定义镜像。镜像名称随意填,反正是一次性的。因为我的实例只有系统盘,所以只有默认资源组可以选,如果你有别的盘,可能可以选择多个。 共享自定义镜像(在同一账号内迁移的跳过这一步) 提交创建后,在镜像菜单可以看到提交的镜像,进度在不断累加,直至100%。等待进度的过程中,我们可以设置镜像共享了。 如下图,在你的镜像菜单点击 更多-共享镜像。 然后输入新实例所在的账号的UID,然后点击共享镜像。 UID在这里: 同一账号不同区域 需要复制镜像到目标区域 在新实例创建系统时选择共享镜像(同一账号内迁移选择自定义镜像) 等待上面镜像创建进度到100%后。就可以在新实例创建镜像了。 如果已经购买了实例,那么需要先停止新实例,然后点击菜单更换操作系统。会弹出镜像选择页面。 若还在创建中,在镜像选择页面直接选择即可 迁移网络安全组 旧实例:网络与安全-安全组,找到你实例所在的安全组。点进去,右上角有导出按钮,导出文件。 新实例:也是对应的页面,点击导入。 更换域名解析 这个就很简单了,将原域名全部解析到新ip即可。 观察流量 确认旧机器没有流量就可以下掉了

2020-01-04 · 1 分钟 · 22 字

2019年度总结

2019是平淡的一年,没有太大的变化,所以觉得平淡无奇。年度总结会以比较特殊的散文形式叙述,形散而神…也散。 首先迎来的是2018年的收场,年会,抽了个还算不错的小奖。 过年与往年一样,亲人朋友间聚聚,除了家里各种商业小店纷纷开起来外,倒是没有其他改变。 接着便真正拉开了新的一年的帷幕,开始返工了。开工利是很大,那天我司小伙伴的朋友圈里纷纷成为了“别人家”的公司,也因此成功拉到前同事入坑。 3月份去办理了公租房轮候,其实就先排着,可能要等十几年呢(笑~),年底时候看了下排名,才到20+w名。看来只能寄希望于暴富啦~ 今年去电影院看的电影不多,比较有印象的是调音师,真的是年度好评的电影。 4月份腾讯出了一款手游,一起来捉妖。这可真是一款宝藏游戏,费鞋又费时间,一度成为我周末出门的一大理由。可惜到后来,周围的妖怪几乎都被我抓光了,便成为了我光明正大卸载的理由(走不动了,走不动了~) 周末或不回去的节假日里,除了和朋友出去爬爬山、聚聚会之外,也会去吃点好吃的,早茶代表:新伊香园,牛蛙代表:蛙小侠(这里推荐南山的欢乐颂店,壹方城店实在太多人),还有就是牛肉火锅代表:八合里了。正巧西丽这边有个分店,平时去吃也很方便。 说起节假日,今年的五一是在顺德度过的,和我哥还有个好基友跑到那边去就是为了吃,可惜,人是真的多啊,各种网红店门口必然排着令人惊叹的长龙,只能忍痛找些小店吃点当地的美食。比较有印象的是双皮奶,还有。额,没有了。真的只有双皮奶,看来我真的喜欢吃甜品呢。 周末会偶尔会和趣宝爬山小队或基友去爬山、徒步啥的。一年算下来也不多,接近10次吧。在大梅沙海滩、羊台山、塘朗山、仙湖公园、深圳湾公园等地方留下了小脚印,中间还去了次HK,后面HK事儿比较多,就没去的计划了。爬山我以为是比较轻松、纯肢体锻炼的事,有时却因为带头大哥不走寻常路的想法,往往会穿插些刺激的经历,今年倒是收敛了很多,点名表扬一下。 5月份尝试用LogicProX写歌,电钢作为midi输入设备。写歌的因由是前公司老大在群里发了李彦宏的歌,我一看Robin都有这么口水的歌,我们Ray同学怎么也得拥有一首更口水的歌吧。于是今年第一首歌就出来了。写歌是一件很累的事,更多的是边写边学习,很多乐理知识一窍不通,更多的是自娱自乐。但凭借这么一首没有学术质量的歌,竟也申请网易云音乐人成功了。于是感慨,这真是一个最好的时代,同时也是最糟糕的时代。今年也就写了两首歌,后面被新项目需求压过来,便没有了这样的闲暇心情。2020年争取多写几首,这个Flag有点压力(hahaa~ 6-7月是比较特别的时间,我竟然暴瘦了7斤。原因是我种了一颗牙(第一阶段)、给三颗牙做了根管治疗。所以有一个月的时间里,我两侧都不能咀嚼,只能靠粥和牛奶勉强度日,还好遇到的医生挺不错的,牙齿弄得棒棒的。换另一个角度来看,这也算2019年里比较令人满意的事儿~ 转眼8月份到了,由于组织需要,我从原来的项目组转了新项目组。开始了加班的日子,10点、11点下班变成了家常便饭,一直到年底都是如此。但是也还好,尽管我不喜欢加班,也不喜欢上班,但从刚毕业实习那时起,我就知道,其实我是一个工作狂。这看似是一件矛盾的事,但其实也不矛盾,既然不得不开始,那就把它做好吧。有什么收获吗?技术上多多少少有一些吧,但是不多;项目进度把控、成员协作方面呢?进步也不多。呀,真是有些挫败。但也够用了。而失去了什么呢?唉,说到损失,昨天就牺牲了两根兄弟,一根叫蔡徐坤,一根叫乔碧萝。我摸摸发凉的后脑勺,唉,杰西卡和弗拉迪斯拉夫也快掉了。(开玩笑,开玩笑~ 优剪的小哥说我发量惊人 9月份,大学宿舍的大哥,也是我的老表哥结婚了。加班的日子里抽空去参加了婚礼,大哥作为宿舍结婚第一人,得到了我们其他几个小家伙的祝福和羡慕。 国庆回家了,归途那天真的特别难忘。那是一个想起来就觉得屁股痛的一天。本应4个小时的路径,我们经历了接近10个小时后终于到家了。感恩。同时也感激早上没有怎么喝水的我。因为假期比较长,大学社团环创举办了20周年庆,这一届的师弟师妹们真的给力,可以看出付出的时间和精力也很多,这一次作为社会人师兄的角色参加聚会,不禁有些唏嘘,自己也没什么拿得出手的经历或者经验给到师弟妹们,或许后面的日子里能有点不一样的经历吧,努力向大佬们看齐。 10月份参加了公司的一次团建,去佛山某温泉度假村。对于吃的,就不说了,嗯。玩的倒还可以,人生第一次划皮艇,第一次泡了温泉和蒸桑拿,是真的热,桑拿,每次有人往滚烫的石头浇水的时候,我都想哭。这次团建总体来说,还算满意。 还是10月份,我换了mbp,这次是16g的。旧的mbp通过闲鱼卖给了一个开教育培训中心的小姐姐,然后收获是经常在朋友圈看到各种可爱的小朋友的画作及一言不合就开始表演的武术。 距离年底还有3天的某个周五傍晚,坐大巴和系统部的同学们一起去龙华团建,是一次高级别墅的轰趴。这次的轰趴很不错,和大伙玩了uno 狼人杀。玩到接近凌晨4点,然后和两位同学通宵唱K,期间睡了一个钟。回去后感觉还是太累了,以后不要轻易喝红牛熬夜了。(反面教材,划重点!!) 对啦,今年下半年我开始理财了,之前会一股脑将工资存余额宝,现在会分析考虑什么理财产品收益高,怎么定投好一些。尽管本金不多,收益不会特别多,但又开始慢慢get一个新技能,是一种很棒的感觉。我是一个喜欢学习的人呢~ 然后就,真的结束了,我的2019。波澜不惊,不知所云。 期望2020,这个世界对我好一些吧,当然,我也会更友好地,对这个世界和人们报以温柔~

2020-01-01 · 1 分钟 · 23 字

腾讯COS - 使用临时密钥下载私有桶对象失败Cos Error Code: AccessDenied【踩坑】

一、 获取临时密钥的请求里,权限列表里需要添加下载权限。php实例代码: $config = [ 'url' => self::URL, 'domain' => self::DOMAIN, 'proxy' => '', 'secretId' => $cos['secret_id'], // 固定密钥 'secretKey' => $cos['secret_key'], // 固定密钥 'bucket' => $bucket, // 换成你的 bucket 'region' => $region, // 换成 bucket 所在园区 'durationSeconds' => self::EXPIRE_TIME, // 密钥有效期 'allowPrefix' => '*', // 这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的目录,例子:* 或者 a/* 或者 a.jpg // 密钥的权限列表。简单上传和分片需要以下的权限, 'allowActions' => array ( // 简单上传 'name/cos:PutObject', 'name/cos:PostObject', // 分片上传 'name/cos:InitiateMultipartUpload', 'name/cos:ListMultipartUploads', 'name/cos:ListParts', 'name/cos:UploadPart', 'name/cos:CompleteMultipartUpload', // 下载 'name/cos:GetObject', ) ]; // 获取临时密钥,计算签名 $tempKeys = $this->sts->getTempKeys($config); 二、确保用于生成临时密钥的账号在所在的桶有相应的权限 https://console.cloud.tencent.com/cos5/bucket 我踩的坑是因为运维给到我的账号是子账号,但是没有权限。使用该子账号的密钥生成的临时密钥能够进行上传操作,但是下载对象返回403。这就很懵逼了。 提了工单给腾讯云,折腾几回合无果后,客服让我在桶所在的权限控制台页面截图看看,说如果是子账号的话,也是需要将子账号及相应权限添加到对应桶的。 让运维将子账号添加到所在桶,并勾选上传、下载数据权限后,成功下载。

2019-09-30 · 1 分钟 · 83 字

【转】Mac打开软件提示:xx已损坏,请移至废纸篓

转载自:简书 解决方法一: 允许任何来源的应用。在系统偏好设置里,打开“安全性和隐私”,将“允许从以下位置下载的应用程序”设置为“任何来源“。当然,这个设置已经无法在Mac OS Sierra上完成了。 在Mac OS Sierra上,应该进行以下操作: 打开终端(Terminal),输入以下命令后回车,输入密码 sudo spctl --master-disable 重新运行下载的应用程序 解决方法二: 移除这个应用的安全隔离属性,操作如下: 打开终端(Terminal),输入以下命令后回车,如需要,请输入密码 xattr -r -d com.apple.quarantine <path> 是你下载的应用程序的路径,一般在/Applications/应用程序名字 重新运行下载的应用程序。

2019-09-08 · 1 分钟 · 23 字

用php对象,简化Json Schema的定义

Github地址 使用php对象,描述Json-Schema变得更容易(支持draft-07 和 draft-06) 使用opis/json-schema作为校验器 好处 定义容易,不用写复杂的json 定义更有可读性 安装 composer require "foamzou/easy-json-schema" 基本使用 use Foamzou\EasyJsonSchema\Manager\Validator; use Foamzou\EasyJsonSchema\Manager\Parser; use Foamzou\EasyJsonSchema\Type\{ Str, Integer }; // 定义一个schema $schema = new Obj([ 'name' => (new Integer)->min(2)->max(5), 'age' => (new Str)->max(120), ]); $data = [ 'name' => 'foam', 'age' => 18, ]; // 生成json-schema $jsonSchema = Parser::run($schema); //校验数据合法性,如果校验失败,errorMessage将返回具体信息 $bool = Validator::getInstance()->isValid($jsonSchema, $data, $errorMessage); Schema的定义 下面是与json-schema的对比,可以看到使用php对象的定义会更简单、更有可读性且更容易维护 php版 ...

2019-07-28 · 2 分钟 · 416 字

nginx proxy_pass后gzip不生效

有一台服务器只能对外开80端口,但该服务器有几个项目同时共用。因此做了一个方案,使用不同的url前缀,proxy_pass到对应项目监听的端口。 如default.conf配置如下 server { listen 80 default_server; location /a/ { rewrite ^/a/(.*)$ /$1 break; # 剥掉 /a 这一层 proxy_pass http://127.0.0.1:8083; } location /b/ { rewrite ^/b/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8084; } location /c/ { rewrite ^/c/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8085; } } a项目配置里开启了gzip server { listen 8083; root /path/to/a; gzip on; gzip_comp_level 3; .... } 但发现gzip未生效。 后面把gzip配置放到default.conf的location部分就正常运行了。 ...

2019-07-26 · 1 分钟 · 82 字