文章851
标签121
分类10

安装笔记:在CentOS上安装pt-online-schema-change

$ yum -y install perl perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5

https://www.percona.com/downloads/percona-toolkit/LATEST/ 下载并安装:

# wget https://www.percona.com/downloads/percona-toolkit/3.1.0/binary/redhat/7/x86_64/percona-toolkit-3.1.0-
2.el7.x86_64.rpm

# rpm -ivh percona-toolkit-3.1.0-2.el7.x86_64.rpm


warning: percona-toolkit-3.1.0-2.el7.x86_64.rpm : Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
error: Failed dependencies:
        perl(DBD::mysql) >= 1.0 is needed by percona-toolkit-3.5.5-1.el7.x86_64
        perl(IO::Socket::SSL) is needed by percona-toolkit-3.5.5-1.el7.x86_64
        perl(Digest::MD5) is needed by percona-toolkit-3.5.5-1.el7.x86_64

安装失败 的方案 增加 --force --nodeps 强制不检测依赖.

编写一个脚本 pt.sh

#!/bin/bash
table=$1
alter_conment=$2

cnn_host='127.0.0.1'
cnn_user='root'
cnn_pwd='密码'
cnn_db='kiddo'

echo "$table"
echo "$alter_conment"
/usr/bin/pt-online-schema-change --charset=utf8mb4 --no-version-check --user=${cnn_user} --password=${cnn_pwd} --host=${cnn_host} P=3306,D=${cnn_db},t=$table --alter "${alter_conment}" --execute --nocheck-unique-key-change --no-check-alter
chmod oug+x pt.sh

例子 :

./pt.sh rec_reading_record_v2_book "DROP PRIMARY KEY, ADD PRIMARY KEY (id, reading_record_id) PARTITION BY RANGE(reading_record_id) (PARTITION p0 VALUES LESS THAN (10000000), PARTITION p1 VALUES LESS THAN (20000000), PARTITION p2 VALUES LESS THAN (30000000))"

亲测 有效 可以尝试下.
账号需要有权限进行DDL 操作

Mac 安装 brew

要在 macOS 上安装 Homebrew(常简称为 Brew),请按照以下步骤进行操作:

打开终端:你可以在 macOS 中的“应用程序”文件夹中找到“终端”应用程序。双击打开它。

安装 Homebrew:在终端中,粘贴或输入以下命令,然后按回车键执行:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

这将下载并运行安装脚本。在此过程中,可能需要输入你的 macOS 用户密码。

等待安装完成:安装过程可能需要一些时间,具体时间取决于你的网络连接和计算机速度。

验证安装:安装完成后,可以通过运行以下命令来验证 Homebrew 是否正确安装:

brew doctor

如果一切正常,它应该显示 "Your system is ready to brew" 或类似的消息,表示 Homebrew 安装成功。

现在,你已成功在 macOS 上安装了 Homebrew。你可以使用 Homebrew 来安装各种软件包、工具和库。你可以在终端中运行 brew help 命令,了解更多有关 Homebrew 的使用方法和命令选项。

注意:在安装 Homebrew 之前,请确保你的计算机已连接到互联网,并且具有管理员权限(能够输入密码)。

国内环境安装 文档请参考 : https://zhuanlan.zhihu.com/p/111014448

[踩坑] 解决nginx反向代理proxy不能转发header报头

今天发现生产环境自定义透传字段 头部转发IP, 错误.

观察了下 获取IP 方式并没有问题. 开发环境ok 的. 区别在于开发环境是直连的, 而生产是 Nginx Proxy

server {
        listen 8080;
        server_name localhost;
        access_log  /data/log/nginx/asset-access.log  main;
        error_log /data/log/nginx/asset-error.log error;

        location / {
                set $mode "test";
                if ($request_uri ~* xxxx=([0-9a-z]+)) {
                        set $mode $1;
                }

                proxy_pass http://swoole_assets;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;

        }
}
upstream swoole_assets{  
        server 10.0.0.1:5001;  
        server 10.0.0.2:1001;  
        hash $mode;
}

上面的配置 本身并没有问题.

问题在于 header name 的字符做了限制,默认 underscores_in_headersoff,表示如果header name 中包含下划线,则忽略掉。

恰好我自定义的 header 中都是用的下划线。

处理办法:
1、配置中 http 部分 增加 underscores_in_headers on; 配置

2、用减号 - 替代下划线符号 _,避免这种变态问题。nginx 默认忽略掉下划线可能有些原因。

可以加到 http 或者 server

语法:underscores_in_headers on|off
默认值:off
使用字段:http, server
是否允许在 header 的字段中带下划线。

文章中提到查询配置问题, 可以提高Nginx log 等级, 调整到debug 模式.

后来我在 nginx.conferror 的日志等级更改为 debug,查看 error_log logs/error.log debug;

解决问题文章 :

https://cloud.tencent.com/developer/article/1835815

Mysql 在线改表工具 PT-Online-Schema-Change

pt-online-schema-change

英文描述是: ALTER tables without locking them,即在线改表。

工具下载地址 : https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

使用场景

在 mysql 5.6 版本以前,修改表结构如添加索引、修改列,需要锁表,期间不能写入,对于一个有几千万数据的大表来说,这个简直不能接收,对于分秒必争的互联网时代,服务中断很长时间的后果是很严重的。

升级 Mysql 到5.6 版本后,情况会好转,支持online-DDL, 但是实际在Alter表的时候,还会有可能锁表。

pt-online-schema-changePercona-toolkit一员, 支持在不锁表的情况下,在线改表。

PT-OSC 工作流程

  1. 创建一个和要执行 alter 操作的表一样的新的空表,后缀默认是new。
  2. 在新表执行alter table 语句,因为是空表,执行速度很快。
  3. 在原表中创建触发器3个触发器分别对应insert,update,delete操作。
  4. 以一定块大小从原表拷贝数据到临时表,拷贝过程中通过原表上的触发器在原表进行的写操作都会更新到新建的临时表,注意这里是Replace操作。
  5. 表明替换 将原表名table修改为 tableold, 将tablenew 表明修改为原表名tabl
  6. 如果有参考该表的外键,根据alter-foreign-keys-method参数的值,检测外键相关的表,做相应设置的处理。
  7. 默认最后将旧原表删除。

使用和常见命令

使用方法:

pt-online-schema-change [OPTIONS] DSN

options是对应的选项 可以在DSN里面指定数据库和表名。

例如,在数据库test中,表名是subscriber,加一列,列名是: name

pt-online-schema-change --alter "ADD COLUMN name VARCHAR(64) DEFAULT ''" D=test,t=subscriber

工具输出:
--print”, 选项,打印详细输出信息。 “--statistics” ,选项,打印统计信息。 如:

# Event Count

# ====== =====

# INSERT 50

常见选项:

1. --dry-run

创建并修改新表,但不会建触发器,拷贝数据。

2.--execute

如果我们测试好后,需要真正的执行alter操作,则需要指定这个选项,如果不指定,工具会默认只做一些检查然后退出。

3.-h xxx -P xxx -u xxx -p xxx: host, port

数据库IP,端口,用户名,密码

4.--alter

实际执行的alter语句, 多个更改用逗号分隔。 以下事项需要注意:

绝大部分情况下表上需要有主键或唯一索引,因为工具在运行当中为了保证新表也是最新的,需要旧表上创建 DELETE和UPDATE 触发器,同步到新表的时候有主键会更快。个别情况是,当alter操作就是在c1列上建立主键时,DELETE触发器将基于c1列。

子句不支持 rename 去给表重命名。

alter命令原表就不支持给索引重命名,需要先dropadd,在pt-osc也一样。(mysql 5.7 支持 RENAME INDEX oldindexname TO newindexname)

但给字段重命名,千万不要drop-add,整列数据会丢失,使用change col1 col1_new type constraint(保持类型和约束一致,否则相当于修改 column type,不能online

子句如果是add column并且定义了not null,那么必须指定default值,否则会失败。

如果要删除外键(名 fk_foo),使用工具的时候外键名要加下划线,比如--alter "DROP FOREIGN KEYfkfoo"

5. D=xxx , t=xxx 指定数据库和表

风险

  1. 默认如果检测到有复制过滤会拒绝改表,修改参数为 --[no]check-replication-filters
  2. 默认如果检测到主从复制延迟会自动停止数据拷贝,调节参数为--max-lag
  3. 默认如果检测到服务器负载过重会停止或中断操作,调节参数为--max-load和--critical-load
  4. 默认会设置锁等待超时时间为1s来避免干扰其他事务的进行,调节参数为--lock-wait-timeout
  5. 默认如果检测到外键冲突后会拒绝改表,调节参数为--alter-foreign-keys-method
  6. 该工具不能在PXC(Percona XtraDB Cluster)集群中对myisam表进行改表操作

建议操作方法

  1. 先执行--dry-run 检查系统支持情况。
  2. 执行 --execute, 但是,设置如下选项:

    --no-drop-old-table
    
    --no-drop-new-table
    
    --no-swap-tables
    
    --no-drop-triggers

    切换服务器,手动删除触发器,改表名。

Mysql 在线执行 DDL 语句不造成长时间锁表的工具.

记录一下 , 之前生产环境生成大量冷数据, 需要切走. 切走后delete 产生很多 内存碎片.

正常是需要停服运行 碎片整理 释放内存.

咨询了下DBA同学 , 说是有在线就可以整理内存碎片的工具.

我没细问DBA同学, 隔天问了下 ChatGPT, 推荐了三个工具

  1. pt-online-schema-change:这是Percona Toolkit提供的一个工具,用于在线执行DDL语句而不会造成长时间的锁表。它会创建一个临时表来进行表结构变更,并在后台逐步复制数据,最后切换到新表。
  2. gh-ost:这是GitHub开源的一个工具,用于在线执行DDL语句而不会造成长时间的锁表。它使用了类似pt-online-schema-change的原理,通过创建临时表和后台数据复制来实现无锁操作。
  3. Percona Online Schema Change for MySQL:这是JetBrains提供的一个工具,用于在线执行DDL语句而不会造成长时间的锁表。它通过创建临时表、在后台复制数据并使用MySQL事件来实现无锁操作

DBA 推荐常用 第一个

">