从开发到生产:online_migrations环境配置与部署策略全解析
从开发到生产online_migrations环境配置与部署策略全解析【免费下载链接】online_migrationsCatch unsafe PostgreSQL migrations in development and run them easier in production (code helpers for table/column renaming, changing column type, adding columns with default, background migrations, etc).项目地址: https://gitcode.com/gh_mirrors/on/online_migrationsonline_migrations是一款强大的PostgreSQL迁移工具能够在开发阶段捕获不安全的迁移操作并简化生产环境中的部署流程。它提供了表/列重命名、列类型变更、带默认值列添加以及后台迁移等实用功能是Ruby on Rails项目数据库迁移的理想选择。快速入门安装与基础配置一键安装步骤要开始使用online_migrations首先需要将其添加到你的Gemfile中gem online_migrations然后运行bundle install安装gem。安装完成后执行以下命令生成必要的迁移文件$ bin/rails generate online_migrations:install这个命令会创建初始化文件和数据库表为后续的迁移操作做好准备。基础配置指南online_migrations的所有配置都集中在initializer文件中。创建config/initializers/online_migrations.rb文件并添加基本配置# config/initializers/online_migrations.rb OnlineMigrations.configure do |config| # 设置迁移超时时间 config.statement_timeout 1.hour # 配置锁超时重试策略 config.lock_retrier OnlineMigrations::ExponentialLockRetrier.new( attempts: 30, base_delay: 0.01.seconds, max_delay: 1.minute ) # 标记小型表对这些表的操作会跳过某些安全检查 config.small_tables [:settings, :prices, :plans] end这个基础配置已经可以满足大多数项目的需求接下来我们将深入探讨更高级的配置选项。开发环境配置安全检查与自定义规则安全检查机制online_migrations在开发环境中默认启用了一系列安全检查防止不安全的数据库操作。这些检查包括禁止在生产环境可能导致锁表的操作检测可能导致性能问题的索引添加防止删除重要列或表你可以在配置文件中禁用特定的检查# 禁用删除索引的检查 config.disable_check(:remove_index)完整的检查列表可以在lib/online_migrations/error_messages.rb中找到。自定义检查规则除了内置检查你还可以添加自定义检查规则。例如限制对users表添加新列config.add_check do |method, args| if method :add_column args[0].to_s users stop!(No more columns on the users table) end end使用stop!方法可以阻止不安全的迁移操作并显示自定义错误消息。开发环境特殊配置为了使开发环境更接近生产环境你可以指定目标数据库版本# 模拟生产环境的PostgreSQL 12 config.target_version 12这确保了开发环境中运行的检查与生产环境保持一致。生产环境配置性能与安全优化数据库超时设置在生产环境中合理的超时设置至关重要。online_migrations提供了两种设置超时的方式通过配置文件设置# 设置语句超时和锁超时 config.statement_timeout 1.hour config.lock_retrier OnlineMigrations::ExponentialLockRetrier.new( attempts: 30, base_delay: 0.01.seconds, max_delay: 1.minute, lock_timeout: 0.2.seconds )直接在数据库用户上设置ALTER ROLE myuser SET lock_timeout 10s; ALTER ROLE myuser SET statement_timeout 1h;推荐在config/database.yml中添加连接超时设置production: connect_timeout: 5 variables: lock_timeout: 10s statement_timeout: 15s高级锁重试策略对于不同类型的迁移操作可能需要不同的锁重试策略。online_migrations允许你根据命令类型自定义重试行为module OnlineMigrations class CommandAwareLockRetrier LockRetrier def attempts(command nil, arguments []) case command when :add_index 10 # 并发索引创建使用较少的尝试次数 when :add_foreign_key 60 # 外键添加使用更多的尝试次数 else 30 # 默认尝试次数 end end def lock_timeout(attempt, command nil, arguments []) case command when :add_index 30.seconds # 索引创建允许更长的锁超时 when :add_foreign_key 5.seconds # 外键添加快速失败 else 10.seconds # 默认锁超时 end end end end config.lock_retrier OnlineMigrations::CommandAwareLockRetrier.new这种灵活的配置确保了不同类型的迁移操作都能以最佳方式执行。详细SQL日志在生产环境中启用详细SQL日志可以帮助排查迁移问题config.verbose_sql_logs true启用后迁移过程中执行的所有SQL语句都会被记录包括锁超时设置和重试信息。这对于调试复杂的迁移问题非常有帮助。后台数据迁移大规模数据处理什么是后台数据迁移当项目增长到一定规模直接在部署过程中执行大型数据迁移会导致严重的性能问题。background_data_migrations允许你在后台异步处理这些操作避免影响应用性能。适用场景大型表的数据更新需要长时间运行的数据转换从API获取数据并更新到数据库配置后台迁移后台数据迁移需要Sidekiq 7.3.3的支持。首先确保你的Gemfile中包含Sidekiqgem sidekiq, 7.3.3然后配置后台迁移调度器。使用whenever gem可以轻松设置定时任务# config/schedule.rb every 1.minute do runner OnlineMigrations.run_background_data_migrations end创建和使用后台迁移使用生成器创建新的后台数据迁移$ bin/rails generate online_migrations:data_migration backfill_project_issues_count这会创建两个文件数据迁移文件和用于入队的常规迁移文件。编辑数据迁移文件实现业务逻辑# lib/online_migrations/data_migrations/backfill_project_issues_count.rb module OnlineMigrations module DataMigrations class BackfillProjectIssuesCount OnlineMigrations::DataMigration class Project ActiveRecord::Base; end def collection Project.in_batches(of: 100) end def process(relation) relation.update_all(~SQL) issues_count ( SELECT COUNT(*) FROM issues WHERE issues.project_id projects.id ) SQL end def count collection.count end end end end然后在常规迁移中入队后台迁移# db/migrate/xxxxxxxxxxxxxx_enqueue_backfill_project_issues_count.rb class EnqueueBackfillProjectIssuesCount ActiveRecord::Migration[8.0] def up enqueue_background_data_migration(BackfillProjectIssuesCount) end def down remove_background_data_migration(BackfillProjectIssuesCount) end end后台迁移监控后台迁移有多种状态可以通过代码监控其进度migration OnlineMigrations::DataMigrations::Migration.find(id) puts 当前状态: #{migration.status} puts 进度: #{migration.progress}%可用状态包括pending、enqueued、running、paused、errored、failed、succeeded等。你还可以通过回调和通知系统集成监控工具# config/initializers/online_migrations.rb ActiveSupport::Notifications.subscribe(completed.background_data_migrations) do |name, start, finish, id, payload| migration payload[:migration] # 发送完成通知 NotificationService.send(Migration #{migration.name} completed) end部署策略确保平滑迁移迁移前检查清单在部署包含数据库迁移的代码前建议执行以下检查本地测试在开发环境中完整测试迁移查看迁移SQL使用rails db:migrate:sql检查生成的SQL检查索引确保没有添加不必要的索引测试回滚执行rails db:rollback测试回滚功能备份数据在生产环境迁移前备份数据库零停机部署策略online_migrations特别适合实现零停机部署。推荐的部署流程如下部署代码先部署包含迁移的代码但不执行迁移执行迁移通过单独的流程执行迁移验证迁移确认迁移成功完成监控性能部署后监控数据库性能对于大型表的变更使用后台迁移确保生产环境不受影响# 使用预定义的后台迁移 def up add_column :users, :new_column, :string backfill_column_in_background(:users, :new_column, default: default_value) end处理迁移失败即使做了充分准备迁移仍可能失败。online_migrations提供了多种处理失败的机制重试失败的迁移migration OnlineMigrations::DataMigrations::Migration.find(id) migration.retry暂停和恢复迁移# 暂停迁移 migration.pause # 恢复迁移 migration.resume取消迁移migration.cancel此外可以配置错误处理器集成异常监控服务config.background_data_migrations.error_handler -(error, errored_migration) do Bugsnag.notify(error) do |notification| notification.add_metadata(:migration, { name: errored_migration.name }) end end最佳实践与常见问题性能优化技巧分批处理对大型表始终使用分批处理collection_batch_size(1000) # 增大批处理大小利用数据库功能使用数据库内置功能而非Ruby代码处理数据# 推荐 relation.update_all(score points * 2) # 不推荐 relation.each { |record| record.update(score: record.points * 2) }指定目标版本在开发环境中模拟生产数据库版本config.target_version 12.9 # 匹配生产环境版本分析表添加索引后自动更新统计信息config.auto_analyze true常见问题解决Q: 迁移被锁定无法执行怎么办A: 检查是否有长时间运行的事务或查询阻塞了迁移。可以使用以下SQL查找锁定的查询SELECT * FROM pg_locks JOIN pg_stat_activity USING (pid) WHERE NOT granted;Q: 如何处理需要回滚的后台迁移A: 创建反向的后台迁移并在down方法中入队def down enqueue_background_data_migration(ReverseBackfillProjectIssuesCount) endQ: 开发环境和生产环境的迁移行为不一致A: 确保配置了target_version使开发环境模拟生产环境config.target_version { primary: 12, analytics: 14 } # 多数据库配置高级配置示例多数据库配置# 配置后台迁移使用特定数据库 OnlineMigrations::ApplicationRecord.connects_to database: { writing: :animals }按分片并行处理# config/schedule.rb [:shard_one, :shard_two, :shard_three].each do |shard| every 1.minute do runner OnlineMigrations.run_background_data_migrations(shard: :#{shard}) end end自定义数据迁移路径config.background_data_migrations.migrations_path app/data_migrations总结与资源online_migrations为PostgreSQL数据库迁移提供了全面的解决方案从开发阶段的安全检查到生产环境的平滑部署。通过合理配置和使用后台迁移功能可以显著降低数据库变更带来的风险确保应用在数据增长过程中保持高性能和可用性。官方资源配置文档docs/configuring.md后台数据迁移指南docs/background_data_migrations.md后台模式迁移指南docs/background_schema_migrations.md升级指南docs/0.27-upgrade.md通过这些资源你可以深入了解online_migrations的所有功能为你的项目构建安全、高效的数据库迁移流程。无论是小型应用还是大型企业系统online_migrations都能帮助你轻松应对数据库变更的挑战。【免费下载链接】online_migrationsCatch unsafe PostgreSQL migrations in development and run them easier in production (code helpers for table/column renaming, changing column type, adding columns with default, background migrations, etc).项目地址: https://gitcode.com/gh_mirrors/on/online_migrations创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

从甲骨文到数字孪生:AI驱动的历史记忆范式革命(全球首份跨文明记忆强度对比报告首发)

从甲骨文到数字孪生:AI驱动的历史记忆范式革命(全球首份跨文明记忆强度对比报告首发)

更多请点击: https://intelliparadigm.com 第一章:从甲骨文到数字孪生:AI驱动的历史记忆范式革命(全球首份跨文明记忆强度对比报告首发) 人类记忆的载体正经历一场静默却深刻的范式跃迁:从龟甲兽骨的刻痕、…

2026/7/25 21:55:11阅读更多 →
低成本落地AI数字人?实测11款方案ROI对比:从万元级SaaS到开源部署,哪款3个月内回本?

低成本落地AI数字人?实测11款方案ROI对比:从万元级SaaS到开源部署,哪款3个月内回本?

更多请点击: https://kaifayun.com 第一章:低成本落地AI数字人?实测11款方案ROI对比:从万元级SaaS到开源部署,哪款3个月内回本? 在真实业务场景中,我们对11款主流AI数字人方案进行了为期90天的…

2026/7/25 21:55:11阅读更多 →
解析semantic_slam核心模块:语义点云生成与八叉树融合技术

解析semantic_slam核心模块:语义点云生成与八叉树融合技术

解析semantic_slam核心模块:语义点云生成与八叉树融合技术 【免费下载链接】semantic_slam Real time semantic slam in ROS with a hand held RGB-D camera 项目地址: https://gitcode.com/gh_mirrors/se/semantic_slam semantic_slam是一个基于ROS的实时语…

2026/7/25 21:55:11阅读更多 →
AI Agent自动化开发实战:Hermes与Codex构建自主编程工作流

AI Agent自动化开发实战:Hermes与Codex构建自主编程工作流

最近在尝试构建一个自动化开发工作流时,我遇到了一个难题:如何让AI助手不仅能理解复杂的开发任务,还能像真正的工程师一样,在服务器上执行命令、修改代码、处理错误,并持续工作数小时而不中断?传统的聊天式AI在需要多步骤、长周期、带状态的操作面前显得力不从心。直到我…

2026/7/25 23:05:20阅读更多 →
《大话文渊慧典》:三

《大话文渊慧典》:三

《文渊慧典》开发手记之三:国内外研究现状摘要:本文系统梳理了全球古籍数字化的主要模式与国内现状。海外方面,美国(如哈佛燕京图书馆)以硬件投入见长但中文OCR精度不足,欧洲(如Europeana&#…

2026/7/25 23:05:20阅读更多 →
番茄小说下载器终极指南:5分钟完成小说下载与格式转换的完整教程

番茄小说下载器终极指南:5分钟完成小说下载与格式转换的完整教程

番茄小说下载器终极指南:5分钟完成小说下载与格式转换的完整教程 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 还在为找不到心仪的小说资源而烦恼吗?…

2026/7/25 23:05:20阅读更多 →
AI安全实例评估:计算预算优化与智能体性能平衡策略

AI安全实例评估:计算预算优化与智能体性能平衡策略

今天我们来深入探讨一个在AI安全领域备受关注的话题:AISecurityInst研究评估计算预算影响。随着AI智能体在生产环境中的部署越来越广泛,如何有效评估和管理计算预算已成为确保系统可靠性和成本效益的关键挑战。AISecurityInst作为一个专注于AI安全实例评…

2026/7/25 23:05:20阅读更多 →
Chrome浏览器安装全攻略:从版本选择到优化设置

Chrome浏览器安装全攻略:从版本选择到优化设置

你有没有遇到过这种情况:刚拿到一台新电脑,或者重装了系统,打开系统自带的浏览器准备下载 Chrome,结果浏览器不是版本太老就是功能受限,连最基本的下载都卡顿半天。更让人头疼的是,好不容易找到下载页面&am…

2026/7/25 23:05:20阅读更多 →
从入门到精通:使用Paper_Reading_List提升计算机视觉研究效率

从入门到精通:使用Paper_Reading_List提升计算机视觉研究效率

从入门到精通:使用Paper_Reading_List提升计算机视觉研究效率 【免费下载链接】Paper_Reading_List Recommended Papers. Subjects: Computer Vision and Pattern Recognition (cs.CV); Artificial Intelligence (cs.AI); Learning (cs.LG) 项目地址: https://git…

2026/7/25 23:03:20阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/25 19:03:04阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/25 19:03:04阅读更多 →