rubydb 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/PULL_REQUEST_TEMPLATE.md +15 -15
- data/.github/workflows/benchmark.yml +26 -26
- data/.github/workflows/compatibility.yml +63 -63
- data/.github/workflows/fuzz.yml +33 -33
- data/.github/workflows/lint.yml +21 -21
- data/.github/workflows/operations.yml +24 -24
- data/.github/workflows/production-validation.yml +111 -111
- data/.github/workflows/release.yml +77 -77
- data/.github/workflows/security.yml +39 -37
- data/.github/workflows/test.yml +26 -26
- data/.github/workflows/workload.yml +58 -58
- data/.gitignore +12 -5
- data/.rubocop.yml +50 -44
- data/.standard.yml +9 -14
- data/ARCHITECTURE.md +21 -21
- data/CHANGELOG.md +49 -27
- data/CODE_OF_CONDUCT.md +13 -13
- data/CONTRIBUTING.md +29 -29
- data/GOVERNANCE.md +16 -16
- data/Gemfile +18 -17
- data/Gemfile.lock +125 -71
- data/README.md +249 -162
- data/ROADMAP.md +27 -27
- data/Rakefile +71 -71
- data/SECURITY.md +54 -54
- data/SUPPORT.md +14 -14
- data/adapters/activerecord/Gemfile +11 -11
- data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +877 -880
- data/adapters/activerecord/rubydb-activerecord.gemspec +21 -21
- data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +155 -143
- data/adapters/ruby/README.md +18 -18
- data/adapters/sequel/README.md +11 -11
- data/config/monitoring/prometheus-alerts.yml +39 -39
- data/config/production.yml +36 -36
- data/docs/README.md +75 -71
- data/docs/architecture/concurrency.md +14 -14
- data/docs/architecture/current-state.md +125 -125
- data/docs/architecture/execution-engine.md +25 -25
- data/docs/architecture/indexes.md +19 -19
- data/docs/architecture/mvcc.md +19 -19
- data/docs/architecture/overview.md +13 -13
- data/docs/architecture/pages.md +11 -11
- data/docs/architecture/production-roadmap.md +82 -82
- data/docs/architecture/query-planner.md +20 -20
- data/docs/architecture/recovery.md +18 -18
- data/docs/architecture/sql-engine.md +12 -12
- data/docs/architecture/storage-engine.md +14 -14
- data/docs/architecture/transactions.md +10 -10
- data/docs/architecture/wal.md +28 -28
- data/docs/cli-cheatsheet.md +98 -98
- data/docs/cli.md +275 -275
- data/docs/contributing/architecture.md +9 -9
- data/docs/contributing/benchmarking.md +14 -14
- data/docs/contributing/development.md +16 -16
- data/docs/contributing/release-process.md +49 -49
- data/docs/contributing/testing.md +16 -16
- data/docs/debugging.md +229 -229
- data/docs/developer/branching.md +10 -10
- data/docs/developer/database-diff.md +10 -10
- data/docs/developer/local-development.md +17 -17
- data/docs/developer/snapshots.md +9 -9
- data/docs/developer/temporal-data.md +10 -10
- data/docs/developer-guide.md +297 -297
- data/docs/getting-started/first-database.md +16 -16
- data/docs/getting-started/first-query.md +13 -13
- data/docs/getting-started/installation.md +19 -19
- data/docs/getting-started/local-to-production.md +300 -300
- data/docs/getting-started/quickstart.md +17 -17
- data/docs/getting-started/rails.md +16 -16
- data/docs/hardening_backlog.md +93 -93
- data/docs/lessons-learned.md +112 -112
- data/docs/operations/backups.md +33 -33
- data/docs/operations/disaster-recovery.md +31 -31
- data/docs/operations/failover.md +30 -30
- data/docs/operations/monitoring.md +25 -25
- data/docs/operations/production-guide.md +295 -295
- data/docs/operations/production-runbook.md +45 -45
- data/docs/operations/replication.md +33 -33
- data/docs/operations/restore.md +6 -6
- data/docs/operations/runbook.md +34 -34
- data/docs/operations/upgrades.md +14 -14
- data/docs/operations/workload-testing.md +17 -17
- data/docs/production-readiness.md +118 -118
- data/docs/production_validation.md +150 -150
- data/docs/rails/active-record.md +11 -11
- data/docs/rails/compatibility-guide.md +90 -90
- data/docs/rails/database-yml.md +92 -92
- data/docs/rails/installation.md +17 -17
- data/docs/rails/migrations.md +17 -17
- data/docs/rails/production.md +82 -82
- data/docs/rails/troubleshooting.md +18 -18
- data/docs/release.md +25 -25
- data/docs/server/architecture.md +10 -10
- data/docs/server/authentication.md +10 -10
- data/docs/server/configuration.md +16 -16
- data/docs/server/connection-pooling.md +10 -10
- data/docs/server/deployment.md +10 -10
- data/docs/server/protocol.md +12 -12
- data/docs/sql/compatibility-guide.md +82 -82
- data/docs/sql/compatibility.md +39 -39
- data/docs/sql/data-types.md +10 -10
- data/docs/sql/functions.md +9 -9
- data/docs/sql/joins.md +9 -9
- data/docs/sql/operators.md +9 -9
- data/docs/sql/sqlite-compatibility.md +21 -21
- data/docs/sql/syntax.md +10 -10
- data/docs/sql/transactions.md +10 -10
- data/docs/troubleshooting.md +244 -244
- data/lessons/01-foundations.md +73 -0
- data/lessons/02-local-development.md +121 -0
- data/lessons/03-embedded-rubydb.md +99 -0
- data/lessons/04-rails-complex-apps.md +138 -0
- data/lessons/05-rubydb-production-server.md +237 -0
- data/lessons/06-postgresql-massive-apps.md +96 -0
- data/lessons/07-hybrid-microservices.md +94 -0
- data/lessons/08-migrations-backups-recovery.md +86 -0
- data/lessons/09-observability-security-scale.md +87 -0
- data/lessons/10-release-readiness.md +125 -0
- data/lib/rubydb/backup/archive.rb +332 -334
- data/lib/rubydb/backup/backup.rb +400 -401
- data/lib/rubydb/backup/incremental.rb +349 -353
- data/lib/rubydb/backup/restore.rb +289 -290
- data/lib/rubydb/backup/snapshot.rb +265 -267
- data/lib/rubydb/backup/verification.rb +276 -279
- data/lib/rubydb/branching/branch.rb +181 -181
- data/lib/rubydb/branching/branch_manager.rb +307 -311
- data/lib/rubydb/branching/branch_metadata.rb +140 -140
- data/lib/rubydb/branching/checkout.rb +165 -166
- data/lib/rubydb/branching/copy_on_write.rb +272 -272
- data/lib/rubydb/branching/diff.rb +137 -138
- data/lib/rubydb/branching/merge.rb +282 -285
- data/lib/rubydb/build_info.rb +15 -15
- data/lib/rubydb/catalog/catalog.rb +391 -391
- data/lib/rubydb/catalog/column.rb +112 -112
- data/lib/rubydb/catalog/constraint.rb +180 -180
- data/lib/rubydb/catalog/database.rb +184 -184
- data/lib/rubydb/catalog/index.rb +97 -97
- data/lib/rubydb/catalog/schema.rb +103 -103
- data/lib/rubydb/catalog/sequence.rb +90 -90
- data/lib/rubydb/catalog/system_catalog.rb +698 -698
- data/lib/rubydb/catalog/table.rb +178 -178
- data/lib/rubydb/catalog/trigger.rb +102 -102
- data/lib/rubydb/catalog/view.rb +66 -66
- data/lib/rubydb/cli/application.rb +163 -163
- data/lib/rubydb/cli/commands/backup.rb +80 -81
- data/lib/rubydb/cli/commands/branch.rb +72 -72
- data/lib/rubydb/cli/commands/checkout.rb +54 -54
- data/lib/rubydb/cli/commands/create.rb +58 -58
- data/lib/rubydb/cli/commands/diff.rb +76 -77
- data/lib/rubydb/cli/commands/doctor.rb +74 -74
- data/lib/rubydb/cli/commands/drop.rb +57 -57
- data/lib/rubydb/cli/commands/init.rb +101 -102
- data/lib/rubydb/cli/commands/inspect.rb +95 -95
- data/lib/rubydb/cli/commands/merge.rb +63 -63
- data/lib/rubydb/cli/commands/migrate.rb +62 -62
- data/lib/rubydb/cli/commands/restart.rb +42 -39
- data/lib/rubydb/cli/commands/restore.rb +121 -121
- data/lib/rubydb/cli/commands/shell.rb +365 -365
- data/lib/rubydb/cli/commands/snapshot.rb +79 -79
- data/lib/rubydb/cli/commands/start.rb +88 -82
- data/lib/rubydb/cli/commands/status.rb +96 -92
- data/lib/rubydb/cli/commands/stop.rb +47 -47
- data/lib/rubydb/cli/commands/vacuum.rb +58 -58
- data/lib/rubydb/cli/formatter.rb +221 -221
- data/lib/rubydb/cli/output.rb +168 -168
- data/lib/rubydb/client/client.rb +302 -304
- data/lib/rubydb/client/connection.rb +414 -415
- data/lib/rubydb/client/connection_pool.rb +168 -168
- data/lib/rubydb/client/connection_url.rb +96 -96
- data/lib/rubydb/client/prepared_statement.rb +60 -60
- data/lib/rubydb/client/result.rb +123 -123
- data/lib/rubydb/client/statement.rb +52 -52
- data/lib/rubydb/client/transaction.rb +130 -130
- data/lib/rubydb/concurrency/concurrency.rb +19 -19
- data/lib/rubydb/concurrency/deadlock_detector.rb +148 -150
- data/lib/rubydb/concurrency/latch.rb +101 -101
- data/lib/rubydb/concurrency/lock_graph.rb +163 -165
- data/lib/rubydb/concurrency/mutex.rb +181 -183
- data/lib/rubydb/concurrency/rw_lock.rb +180 -180
- data/lib/rubydb/concurrency/scheduler.rb +248 -250
- data/lib/rubydb/concurrency/worker_pool.rb +145 -143
- data/lib/rubydb/configuration/config.rb +170 -170
- data/lib/rubydb/configuration/defaults.rb +179 -179
- data/lib/rubydb/configuration/environment.rb +152 -152
- data/lib/rubydb/configuration/parser.rb +185 -185
- data/lib/rubydb/configuration/validation.rb +221 -221
- data/lib/rubydb/constants.rb +74 -74
- data/lib/rubydb/constraints/check.rb +181 -181
- data/lib/rubydb/constraints/constraint.rb +101 -101
- data/lib/rubydb/constraints/foreign_key.rb +130 -130
- data/lib/rubydb/constraints/not_null.rb +64 -64
- data/lib/rubydb/constraints/primary_key.rb +99 -99
- data/lib/rubydb/constraints/unique.rb +106 -108
- data/lib/rubydb/constraints/validator.rb +349 -350
- data/lib/rubydb/errors/authentication_error.rb +10 -10
- data/lib/rubydb/errors/authorization_error.rb +23 -23
- data/lib/rubydb/errors/client_error.rb +10 -10
- data/lib/rubydb/errors/configuration_error.rb +10 -10
- data/lib/rubydb/errors/connection_error.rb +10 -10
- data/lib/rubydb/errors/constraint_error.rb +23 -23
- data/lib/rubydb/errors/corruption_error.rb +10 -10
- data/lib/rubydb/errors/database_error.rb +10 -10
- data/lib/rubydb/errors/error.rb +20 -20
- data/lib/rubydb/errors/execution_error.rb +10 -10
- data/lib/rubydb/errors/parser_error.rb +10 -10
- data/lib/rubydb/errors/recovery_error.rb +10 -10
- data/lib/rubydb/errors/replication_error.rb +10 -10
- data/lib/rubydb/errors/server_error.rb +6 -6
- data/lib/rubydb/errors/storage_error.rb +10 -10
- data/lib/rubydb/errors/transaction_error.rb +10 -10
- data/lib/rubydb/execution/aggregate_executor.rb +134 -138
- data/lib/rubydb/execution/delete_executor.rb +110 -112
- data/lib/rubydb/execution/distinct_executor.rb +131 -135
- data/lib/rubydb/execution/executor.rb +1195 -1192
- data/lib/rubydb/execution/expression.rb +191 -193
- data/lib/rubydb/execution/index_scan.rb +142 -142
- data/lib/rubydb/execution/insert_executor.rb +215 -217
- data/lib/rubydb/execution/join_executor.rb +243 -249
- data/lib/rubydb/execution/limit_executor.rb +83 -85
- data/lib/rubydb/execution/optimizer.rb +227 -215
- data/lib/rubydb/execution/plan.rb +355 -353
- data/lib/rubydb/execution/planner.rb +542 -536
- data/lib/rubydb/execution/predicate.rb +235 -235
- data/lib/rubydb/execution/scan.rb +49 -49
- data/lib/rubydb/execution/sequential_scan.rb +63 -63
- data/lib/rubydb/execution/sort_executor.rb +180 -185
- data/lib/rubydb/execution/update_executor.rb +160 -162
- data/lib/rubydb/functions/aggregate.rb +70 -70
- data/lib/rubydb/functions/date_functions.rb +274 -278
- data/lib/rubydb/functions/function.rb +85 -85
- data/lib/rubydb/functions/json_functions.rb +231 -215
- data/lib/rubydb/functions/numeric_functions.rb +346 -346
- data/lib/rubydb/functions/scalar.rb +52 -52
- data/lib/rubydb/functions/string_functions.rb +383 -383
- data/lib/rubydb/functions/system_functions.rb +258 -246
- data/lib/rubydb/history/as_of.rb +238 -238
- data/lib/rubydb/history/change.rb +105 -105
- data/lib/rubydb/history/history.rb +131 -131
- data/lib/rubydb/history/history_manager.rb +228 -229
- data/lib/rubydb/history/temporal_query.rb +202 -202
- data/lib/rubydb/history/timeline.rb +144 -144
- data/lib/rubydb/indexes/btree.rb +186 -186
- data/lib/rubydb/indexes/btree_cursor.rb +258 -258
- data/lib/rubydb/indexes/btree_node.rb +384 -385
- data/lib/rubydb/indexes/hash_index.rb +150 -150
- data/lib/rubydb/indexes/index.rb +71 -71
- data/lib/rubydb/indexes/index_manager.rb +408 -406
- data/lib/rubydb/indexes/index_scan.rb +466 -470
- data/lib/rubydb/migrations/migration.rb +253 -254
- data/lib/rubydb/migrations/migration_lock.rb +146 -146
- data/lib/rubydb/migrations/migration_manager.rb +187 -176
- data/lib/rubydb/migrations/migration_version.rb +71 -71
- data/lib/rubydb/migrations/schema_diff.rb +211 -211
- data/lib/rubydb/migrations/schema_version.rb +64 -64
- data/lib/rubydb/monitoring/events.rb +155 -160
- data/lib/rubydb/monitoring/health.rb +216 -222
- data/lib/rubydb/monitoring/logger.rb +188 -193
- data/lib/rubydb/monitoring/metrics.rb +363 -359
- data/lib/rubydb/monitoring/performance.rb +176 -176
- data/lib/rubydb/monitoring/statistics.rb +168 -170
- data/lib/rubydb/mvcc/garbage_collector.rb +199 -199
- data/lib/rubydb/mvcc/mvcc.rb +16 -16
- data/lib/rubydb/mvcc/snapshot.rb +146 -147
- data/lib/rubydb/mvcc/vacuum.rb +180 -180
- data/lib/rubydb/mvcc/version.rb +106 -106
- data/lib/rubydb/mvcc/version_store.rb +396 -398
- data/lib/rubydb/mvcc/visibility.rb +107 -109
- data/lib/rubydb/protocol/capabilities.rb +125 -125
- data/lib/rubydb/protocol/decoder.rb +142 -145
- data/lib/rubydb/protocol/encoder.rb +131 -136
- data/lib/rubydb/protocol/handshake.rb +306 -305
- data/lib/rubydb/protocol/message.rb +121 -121
- data/lib/rubydb/protocol/parameter_binder.rb +101 -0
- data/lib/rubydb/protocol/protocol.rb +276 -277
- data/lib/rubydb/protocol/version.rb +54 -54
- data/lib/rubydb/rails/adapter.rb +245 -239
- data/lib/rubydb/rails/connection.rb +312 -314
- data/lib/rubydb/rails/database_statements.rb +122 -122
- data/lib/rubydb/rails/migration.rb +131 -131
- data/lib/rubydb/rails/quoting.rb +109 -109
- data/lib/rubydb/rails/result.rb +123 -120
- data/lib/rubydb/rails/schema_statements.rb +339 -339
- data/lib/rubydb/rails/transaction.rb +105 -105
- data/lib/rubydb/rails/type.rb +126 -126
- data/lib/rubydb/recovery/checkpoint.rb +261 -257
- data/lib/rubydb/recovery/consistency.rb +457 -467
- data/lib/rubydb/recovery/corruption_detector.rb +5 -5
- data/lib/rubydb/recovery/crash_recovery.rb +381 -387
- data/lib/rubydb/recovery/recovery_manager.rb +204 -206
- data/lib/rubydb/recovery/redo.rb +235 -237
- data/lib/rubydb/recovery/undo.rb +204 -206
- data/lib/rubydb/replication/failover.rb +5 -5
- data/lib/rubydb/replication/fencing.rb +63 -63
- data/lib/rubydb/replication/primary.rb +461 -450
- data/lib/rubydb/replication/replica.rb +382 -384
- data/lib/rubydb/replication/replication_log.rb +194 -200
- data/lib/rubydb/replication/replication_manager.rb +307 -308
- data/lib/rubydb/replication/replication_slot.rb +293 -295
- data/lib/rubydb/replication/replication_stream.rb +198 -201
- data/lib/rubydb/rubydb.rb +564 -560
- data/lib/rubydb/security/access_control.rb +252 -254
- data/lib/rubydb/security/audit_log.rb +209 -213
- data/lib/rubydb/security/authentication.rb +302 -302
- data/lib/rubydb/security/authorization.rb +282 -282
- data/lib/rubydb/security/credentials.rb +192 -196
- data/lib/rubydb/security/password.rb +205 -215
- data/lib/rubydb/security/permissions.rb +74 -74
- data/lib/rubydb/security/role.rb +99 -101
- data/lib/rubydb/security/user.rb +86 -86
- data/lib/rubydb/server/connection.rb +383 -366
- data/lib/rubydb/server/connection_pool.rb +193 -193
- data/lib/rubydb/server/lifecycle.rb +227 -228
- data/lib/rubydb/server/listener.rb +139 -136
- data/lib/rubydb/server/request_handler.rb +277 -276
- data/lib/rubydb/server/server.rb +363 -364
- data/lib/rubydb/server/session.rb +371 -369
- data/lib/rubydb/server/worker.rb +206 -210
- data/lib/rubydb/server/worker_pool.rb +168 -168
- data/lib/rubydb/sql/ast/alter_table.rb +169 -169
- data/lib/rubydb/sql/ast/begin_transaction.rb +47 -47
- data/lib/rubydb/sql/ast/commit.rb +37 -37
- data/lib/rubydb/sql/ast/constraint.rb +92 -83
- data/lib/rubydb/sql/ast/create_database.rb +41 -41
- data/lib/rubydb/sql/ast/create_index.rb +61 -61
- data/lib/rubydb/sql/ast/create_schema.rb +52 -52
- data/lib/rubydb/sql/ast/create_table.rb +187 -187
- data/lib/rubydb/sql/ast/delete.rb +54 -54
- data/lib/rubydb/sql/ast/drop_database.rb +41 -41
- data/lib/rubydb/sql/ast/drop_index.rb +41 -41
- data/lib/rubydb/sql/ast/drop_schema.rb +49 -49
- data/lib/rubydb/sql/ast/drop_table.rb +49 -49
- data/lib/rubydb/sql/ast/explain.rb +64 -64
- data/lib/rubydb/sql/ast/expression.rb +617 -604
- data/lib/rubydb/sql/ast/insert.rb +66 -66
- data/lib/rubydb/sql/ast/node.rb +42 -42
- data/lib/rubydb/sql/ast/rollback.rb +63 -63
- data/lib/rubydb/sql/ast/savepoint.rb +59 -59
- data/lib/rubydb/sql/ast/select.rb +88 -88
- data/lib/rubydb/sql/ast/set_operation.rb +22 -20
- data/lib/rubydb/sql/ast/trigger.rb +35 -29
- data/lib/rubydb/sql/ast/update.rb +88 -88
- data/lib/rubydb/sql/ast/vacuum.rb +19 -19
- data/lib/rubydb/sql/ast/view.rb +38 -32
- data/lib/rubydb/sql/ast/with.rb +32 -32
- data/lib/rubydb/sql/grammar.rb +86 -86
- data/lib/rubydb/sql/keywords.rb +156 -156
- data/lib/rubydb/sql/lexer.rb +209 -214
- data/lib/rubydb/sql/operators.rb +100 -100
- data/lib/rubydb/sql/parser.rb +1167 -1170
- data/lib/rubydb/sql/planner/analyzer.rb +283 -302
- data/lib/rubydb/sql/planner/binder.rb +537 -550
- data/lib/rubydb/sql/planner/type_checker.rb +427 -431
- data/lib/rubydb/sql/token.rb +210 -210
- data/lib/rubydb/storage/buffer_frame.rb +44 -44
- data/lib/rubydb/storage/buffer_pool.rb +155 -155
- data/lib/rubydb/storage/database_lock.rb +74 -74
- data/lib/rubydb/storage/deserializer.rb +332 -342
- data/lib/rubydb/storage/engine.rb +2347 -2330
- data/lib/rubydb/storage/file_manager.rb +191 -187
- data/lib/rubydb/storage/free_space_map.rb +79 -81
- data/lib/rubydb/storage/page.rb +92 -94
- data/lib/rubydb/storage/page_allocator.rb +852 -855
- data/lib/rubydb/storage/page_header.rb +63 -67
- data/lib/rubydb/storage/page_manager.rb +127 -131
- data/lib/rubydb/storage/record.rb +58 -58
- data/lib/rubydb/storage/row.rb +78 -78
- data/lib/rubydb/storage/serializer.rb +51 -51
- data/lib/rubydb/storage/storage_layout.rb +151 -151
- data/lib/rubydb/storage/storage_manager.rb +114 -114
- data/lib/rubydb/storage/tuple.rb +458 -461
- data/lib/rubydb/storage/visibility_map.rb +964 -973
- data/lib/rubydb/transactions/commit_manager.rb +219 -220
- data/lib/rubydb/transactions/isolation.rb +98 -98
- data/lib/rubydb/transactions/lock.rb +76 -76
- data/lib/rubydb/transactions/lock_manager.rb +359 -362
- data/lib/rubydb/transactions/savepoint.rb +142 -143
- data/lib/rubydb/transactions/transaction.rb +214 -215
- data/lib/rubydb/transactions/transaction_id.rb +84 -84
- data/lib/rubydb/transactions/transaction_log.rb +256 -257
- data/lib/rubydb/transactions/transaction_manager.rb +434 -435
- data/lib/rubydb/types/bigint.rb +36 -36
- data/lib/rubydb/types/blob.rb +37 -37
- data/lib/rubydb/types/boolean.rb +34 -34
- data/lib/rubydb/types/date.rb +39 -39
- data/lib/rubydb/types/decimal.rb +48 -48
- data/lib/rubydb/types/float.rb +34 -34
- data/lib/rubydb/types/integer.rb +36 -36
- data/lib/rubydb/types/json.rb +41 -41
- data/lib/rubydb/types/null.rb +34 -34
- data/lib/rubydb/types/smallint.rb +36 -36
- data/lib/rubydb/types/text.rb +37 -37
- data/lib/rubydb/types/time.rb +46 -46
- data/lib/rubydb/types/timestamp.rb +39 -39
- data/lib/rubydb/types/type.rb +119 -119
- data/lib/rubydb/types/uuid.rb +47 -47
- data/lib/rubydb/types/varchar.rb +37 -37
- data/lib/rubydb/version.rb +32 -32
- data/lib/rubydb/wal/archive.rb +190 -193
- data/lib/rubydb/wal/checkpoint.rb +181 -183
- data/lib/rubydb/wal/lsn.rb +94 -94
- data/lib/rubydb/wal/reader.rb +259 -260
- data/lib/rubydb/wal/record.rb +105 -105
- data/lib/rubydb/wal/segment.rb +193 -193
- data/lib/rubydb/wal/wal.rb +480 -452
- data/lib/rubydb/wal/writer.rb +236 -236
- data/lib/rubydb.rb +7 -7
- data/packaging/docker/docker-compose.failover.yml +43 -43
- data/packaging/homebrew/rubydb.rb +19 -19
- data/rubydb.gemspec +60 -57
- data/scripts/benchmark +7 -7
- data/scripts/durability_drill +37 -37
- data/scripts/fuzz +63 -63
- data/scripts/release +45 -40
- data/scripts/release_check +43 -43
- data/scripts/replication_failover_drill +268 -250
- data/scripts/replication_network_failover_drill +287 -255
- data/scripts/restore_drill +45 -45
- data/scripts/security +45 -0
- metadata +54 -1
data/docs/cli.md
CHANGED
|
@@ -1,275 +1,275 @@
|
|
|
1
|
-
# RubyDB CLI guide
|
|
2
|
-
|
|
3
|
-
The `rubydb` command manages local databases, server processes, migrations,
|
|
4
|
-
backups, snapshots, branches, inspection, maintenance, and health checks. Run
|
|
5
|
-
`rubydb --help` or `rubydb <command> --help` for the installed command's live
|
|
6
|
-
options.
|
|
7
|
-
|
|
8
|
-
## Command shape
|
|
9
|
-
|
|
10
|
-
```text
|
|
11
|
-
rubydb [global options] <command> [command options]
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
Global options must appear before the command:
|
|
15
|
-
|
|
16
|
-
```sh
|
|
17
|
-
rubydb --version
|
|
18
|
-
rubydb --no-color --env production status --json
|
|
19
|
-
rubydb --config config/production.yml --env production doctor --json
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
Global options are `--config FILE`, `--env ENV`, `--verbose`, `--quiet`,
|
|
23
|
-
`--no-color`, `--help`, and `--version`. Commands return zero on success and a
|
|
24
|
-
non-zero status on failure. Keep `RUBYDB_DEBUG=1` available when a failed
|
|
25
|
-
command needs a Ruby backtrace; never include secrets in captured logs.
|
|
26
|
-
|
|
27
|
-
## Initialize or create a database
|
|
28
|
-
|
|
29
|
-
`init` creates a named database under a data directory and installs the default
|
|
30
|
-
RubyDB metadata/users/sessions tables:
|
|
31
|
-
|
|
32
|
-
```sh
|
|
33
|
-
rubydb init --name app --dir data
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
`create` creates an empty database file:
|
|
37
|
-
|
|
38
|
-
```sh
|
|
39
|
-
rubydb create --name app --dir data
|
|
40
|
-
rubydb create --database /var/lib/rubydb/app.rdb
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
`--force` is destructive for an existing database. Use it only for a disposable
|
|
44
|
-
development directory after verifying the path. It is not a production reset
|
|
45
|
-
procedure.
|
|
46
|
-
|
|
47
|
-
## Start, stop, restart, and status
|
|
48
|
-
|
|
49
|
-
Start a foreground server for development or a service manager:
|
|
50
|
-
|
|
51
|
-
```sh
|
|
52
|
-
rubydb --env production start \
|
|
53
|
-
--host 127.0.0.1 \
|
|
54
|
-
--port 7432 \
|
|
55
|
-
--data-dir /var/lib/rubydb/data \
|
|
56
|
-
--log-dir /var/log/rubydb \
|
|
57
|
-
--pid-file /run/rubydb.pid
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Use `--daemon` only when an external service manager is not supervising the
|
|
61
|
-
process. Prefer systemd, a container supervisor, or an equivalent process
|
|
62
|
-
manager for production. Stop gracefully first:
|
|
63
|
-
|
|
64
|
-
```sh
|
|
65
|
-
rubydb stop --pid-file /run/rubydb.pid
|
|
66
|
-
rubydb restart --pid-file /run/rubydb.pid
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
`--force` sends a hard termination and can interrupt active work; reserve it
|
|
70
|
-
for a confirmed hung process after preserving logs and checking recovery needs.
|
|
71
|
-
|
|
72
|
-
Inspect local status:
|
|
73
|
-
|
|
74
|
-
```sh
|
|
75
|
-
rubydb --env production status
|
|
76
|
-
rubydb --env production status --json > status.json
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Use JSON status in monitoring, but combine it with the server readiness endpoint,
|
|
80
|
-
Prometheus metrics, process state, disk-space checks, and application probes.
|
|
81
|
-
|
|
82
|
-
## Doctor and inspect
|
|
83
|
-
|
|
84
|
-
`doctor` runs health/integrity checks. Start with a read-only quick check:
|
|
85
|
-
|
|
86
|
-
```sh
|
|
87
|
-
rubydb doctor --quick --json
|
|
88
|
-
rubydb doctor --json > doctor.json
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
`doctor --fix` may perform supported repairs. Take and verify a backup first,
|
|
92
|
-
stop application writes, record the output, and review every proposed action:
|
|
93
|
-
|
|
94
|
-
```sh
|
|
95
|
-
rubydb doctor --fix
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
`inspect` reports storage internals without replacing a backup or integrity
|
|
99
|
-
verification:
|
|
100
|
-
|
|
101
|
-
```sh
|
|
102
|
-
rubydb inspect --database data/app.rdb --stats --wal
|
|
103
|
-
rubydb inspect --database data/app.rdb --pages --indexes
|
|
104
|
-
rubydb inspect --database data/app.rdb --table users
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Use `inspect --wal` to correlate WAL growth with checkpoint/backup incidents.
|
|
108
|
-
Do not edit files based on an inspection result; use the documented recovery
|
|
109
|
-
procedure.
|
|
110
|
-
|
|
111
|
-
## SQL shell
|
|
112
|
-
|
|
113
|
-
Open the configured local database shell:
|
|
114
|
-
|
|
115
|
-
```sh
|
|
116
|
-
rubydb shell --database app
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
Output modes include `--table`, `--json`, and `--csv`. The shell supports these
|
|
120
|
-
dot-commands:
|
|
121
|
-
|
|
122
|
-
| Command | Purpose |
|
|
123
|
-
| --- | --- |
|
|
124
|
-
| `.help`, `.?` | Show shell help |
|
|
125
|
-
| `.exit`, `.quit` | Exit safely |
|
|
126
|
-
| `.status` | Show connection/database status |
|
|
127
|
-
| `.tables` | List tables |
|
|
128
|
-
| `.table NAME` | Describe columns and constraints |
|
|
129
|
-
| `.schema NAME` | Show a table definition |
|
|
130
|
-
| `.db NAME` | Switch configured local database |
|
|
131
|
-
| `.begin`, `.txn` | Begin a transaction |
|
|
132
|
-
| `.commit` | Commit the active transaction |
|
|
133
|
-
| `.rollback` | Roll back the active transaction |
|
|
134
|
-
| `.explain SQL` | Show the selected query plan |
|
|
135
|
-
| `.clear`, `.cls` | Clear the terminal |
|
|
136
|
-
|
|
137
|
-
Example:
|
|
138
|
-
|
|
139
|
-
```text
|
|
140
|
-
users> .tables
|
|
141
|
-
users> SELECT id, email FROM users ORDER BY id LIMIT 20;
|
|
142
|
-
users> .begin
|
|
143
|
-
users> UPDATE users SET active = TRUE WHERE id = 1;
|
|
144
|
-
users> .rollback
|
|
145
|
-
users> .exit
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
Use bound parameters from application/client APIs for untrusted values. The
|
|
149
|
-
shell is an administrative tool, not a connection-pool substitute. For
|
|
150
|
-
multiple application processes, use the managed server and client libraries;
|
|
151
|
-
never open one embedded path concurrently from independent processes.
|
|
152
|
-
|
|
153
|
-
## Migrations
|
|
154
|
-
|
|
155
|
-
Run migrations from the default `db/migrate` directory:
|
|
156
|
-
|
|
157
|
-
```sh
|
|
158
|
-
rubydb migrate --database data/app.rdb --path db/migrate
|
|
159
|
-
rubydb migrate --database data/app.rdb --path db/migrate --dry-run
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
To roll back, specify the number of steps and use a verified backup boundary:
|
|
163
|
-
|
|
164
|
-
```sh
|
|
165
|
-
rubydb migrate --database data/app.rdb --path db/migrate --down --steps 1
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
`--version VERSION` targets a migration version. Before applying migrations in
|
|
169
|
-
production, stop or coordinate writes, create a verified backup, test against a
|
|
170
|
-
populated restore, run schema dump/load and application smoke queries, and keep
|
|
171
|
-
the pre-migration directory until rollback closes. Applied migration checksum
|
|
172
|
-
changes fail closed.
|
|
173
|
-
|
|
174
|
-
## Backups and restore
|
|
175
|
-
|
|
176
|
-
Create a verified full backup:
|
|
177
|
-
|
|
178
|
-
```sh
|
|
179
|
-
rubydb backup --database data/app.rdb --dir backups --type full --compress
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
The supported types are `full`, `incremental`, and `differential`. Use
|
|
183
|
-
`--no-verify` only for controlled diagnostics; a release or production backup
|
|
184
|
-
should verify. Retain the manifest, checksum, database version, and required
|
|
185
|
-
WAL chain together.
|
|
186
|
-
|
|
187
|
-
List or dry-run a restore before changing a live path:
|
|
188
|
-
|
|
189
|
-
```sh
|
|
190
|
-
rubydb restore --dir backups --latest --dry-run
|
|
191
|
-
rubydb restore --database data/app.rdb --dir backups --backup BACKUP_NAME --dry-run
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
Restore to a new inactive directory whenever possible. `--force` is destructive
|
|
195
|
-
and must not overwrite the only source. After restore, reopen the engine, verify
|
|
196
|
-
schema and row evidence, run application smoke queries, and record RPO/RTO.
|
|
197
|
-
Point-in-time restore uses `--point-in-time TIME` only when the required WAL
|
|
198
|
-
chain is present and verified.
|
|
199
|
-
|
|
200
|
-
## Snapshots
|
|
201
|
-
|
|
202
|
-
Snapshots are useful for staging, inspection, and branch workflows:
|
|
203
|
-
|
|
204
|
-
```sh
|
|
205
|
-
rubydb snapshot --database data/app.rdb --dir snapshots --name before-migration
|
|
206
|
-
rubydb snapshot --database data/app.rdb --dir snapshots --list
|
|
207
|
-
rubydb snapshot --database data/app.rdb --dir snapshots --restore before-migration
|
|
208
|
-
rubydb snapshot --database data/app.rdb --dir snapshots --delete old-snapshot
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
Keep snapshot metadata/checksums and do not treat snapshots as the only backup.
|
|
212
|
-
Restore into a separate destination before routing traffic.
|
|
213
|
-
|
|
214
|
-
## Branches and database diff
|
|
215
|
-
|
|
216
|
-
List or create a branch:
|
|
217
|
-
|
|
218
|
-
```sh
|
|
219
|
-
rubydb branch --database data/app.rdb --branch-dir branches --list
|
|
220
|
-
rubydb branch --database data/app.rdb --branch-dir branches --create feature-x --from main
|
|
221
|
-
rubydb checkout --database data/app.rdb --branch-dir branches feature-x
|
|
222
|
-
rubydb checkout --database data/app.rdb --branch-dir branches --create experiment
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
Review changes before merging:
|
|
226
|
-
|
|
227
|
-
```sh
|
|
228
|
-
rubydb diff --database data/app.rdb --branch-dir branches main feature-x
|
|
229
|
-
rubydb diff --database data/app.rdb --branch-dir branches --summary main feature-x
|
|
230
|
-
rubydb diff --database data/app.rdb --branch-dir branches --table users main feature-x
|
|
231
|
-
rubydb merge --database data/app.rdb --branch-dir branches feature-x --into main
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
`merge` supports the configured strategy and `--no-commit`. Take a verified
|
|
235
|
-
backup, review the diff, test the target with representative data, and preserve
|
|
236
|
-
the pre-merge state. Branches are not replication or backup replacements.
|
|
237
|
-
|
|
238
|
-
## Vacuum and maintenance
|
|
239
|
-
|
|
240
|
-
Preview maintenance first:
|
|
241
|
-
|
|
242
|
-
```sh
|
|
243
|
-
rubydb vacuum --database data/app.rdb --dry-run
|
|
244
|
-
rubydb vacuum --database data/app.rdb --table users
|
|
245
|
-
rubydb vacuum --database data/app.rdb --full --analyze
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
Run full vacuum only during an approved maintenance window. Long-running
|
|
249
|
-
transactions may retain versions and prevent space reclamation. Monitor free
|
|
250
|
-
space, WAL/checkpoint behavior, query latency, and active transaction age.
|
|
251
|
-
|
|
252
|
-
## Production command sequences
|
|
253
|
-
|
|
254
|
-
### Pre-deployment
|
|
255
|
-
|
|
256
|
-
```sh
|
|
257
|
-
rubydb --config config/production.yml --env production doctor --quick --json
|
|
258
|
-
rubydb --config config/production.yml --env production status --json
|
|
259
|
-
rubydb backup --database /var/lib/rubydb/app.rdb --dir /var/backups/rubydb --type full --compress
|
|
260
|
-
rubydb migrate --database /var/lib/rubydb/app.rdb --path db/migrate --dry-run
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Incident preservation
|
|
264
|
-
|
|
265
|
-
Stop writes, preserve the database/WAL/log/configuration set, copy it to an
|
|
266
|
-
incident directory, and then use `doctor --quick`, `inspect --stats --wal`, and
|
|
267
|
-
the restore procedure. Do not use `drop --force`, `create --force`, or vacuum as
|
|
268
|
-
an attempted corruption repair.
|
|
269
|
-
|
|
270
|
-
### Release evidence
|
|
271
|
-
|
|
272
|
-
Archive command output with the RubyDB commit/version, Ruby version, OS,
|
|
273
|
-
database path class, workload, backup name/checksum, restore time, and operator.
|
|
274
|
-
The CLI is one part of the production evidence; CI, workload, failover, and
|
|
275
|
-
security review records are also required.
|
|
1
|
+
# RubyDB CLI guide
|
|
2
|
+
|
|
3
|
+
The `rubydb` command manages local databases, server processes, migrations,
|
|
4
|
+
backups, snapshots, branches, inspection, maintenance, and health checks. Run
|
|
5
|
+
`rubydb --help` or `rubydb <command> --help` for the installed command's live
|
|
6
|
+
options.
|
|
7
|
+
|
|
8
|
+
## Command shape
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
rubydb [global options] <command> [command options]
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Global options must appear before the command:
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
rubydb --version
|
|
18
|
+
rubydb --no-color --env production status --json
|
|
19
|
+
rubydb --config config/production.yml --env production doctor --json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Global options are `--config FILE`, `--env ENV`, `--verbose`, `--quiet`,
|
|
23
|
+
`--no-color`, `--help`, and `--version`. Commands return zero on success and a
|
|
24
|
+
non-zero status on failure. Keep `RUBYDB_DEBUG=1` available when a failed
|
|
25
|
+
command needs a Ruby backtrace; never include secrets in captured logs.
|
|
26
|
+
|
|
27
|
+
## Initialize or create a database
|
|
28
|
+
|
|
29
|
+
`init` creates a named database under a data directory and installs the default
|
|
30
|
+
RubyDB metadata/users/sessions tables:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
rubydb init --name app --dir data
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`create` creates an empty database file:
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
rubydb create --name app --dir data
|
|
40
|
+
rubydb create --database /var/lib/rubydb/app.rdb
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`--force` is destructive for an existing database. Use it only for a disposable
|
|
44
|
+
development directory after verifying the path. It is not a production reset
|
|
45
|
+
procedure.
|
|
46
|
+
|
|
47
|
+
## Start, stop, restart, and status
|
|
48
|
+
|
|
49
|
+
Start a foreground server for development or a service manager:
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
rubydb --env production start \
|
|
53
|
+
--host 127.0.0.1 \
|
|
54
|
+
--port 7432 \
|
|
55
|
+
--data-dir /var/lib/rubydb/data \
|
|
56
|
+
--log-dir /var/log/rubydb \
|
|
57
|
+
--pid-file /run/rubydb.pid
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Use `--daemon` only when an external service manager is not supervising the
|
|
61
|
+
process. Prefer systemd, a container supervisor, or an equivalent process
|
|
62
|
+
manager for production. Stop gracefully first:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
rubydb stop --pid-file /run/rubydb.pid
|
|
66
|
+
rubydb restart --pid-file /run/rubydb.pid
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`--force` sends a hard termination and can interrupt active work; reserve it
|
|
70
|
+
for a confirmed hung process after preserving logs and checking recovery needs.
|
|
71
|
+
|
|
72
|
+
Inspect local status:
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
rubydb --env production status
|
|
76
|
+
rubydb --env production status --json > status.json
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Use JSON status in monitoring, but combine it with the server readiness endpoint,
|
|
80
|
+
Prometheus metrics, process state, disk-space checks, and application probes.
|
|
81
|
+
|
|
82
|
+
## Doctor and inspect
|
|
83
|
+
|
|
84
|
+
`doctor` runs health/integrity checks. Start with a read-only quick check:
|
|
85
|
+
|
|
86
|
+
```sh
|
|
87
|
+
rubydb doctor --quick --json
|
|
88
|
+
rubydb doctor --json > doctor.json
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`doctor --fix` may perform supported repairs. Take and verify a backup first,
|
|
92
|
+
stop application writes, record the output, and review every proposed action:
|
|
93
|
+
|
|
94
|
+
```sh
|
|
95
|
+
rubydb doctor --fix
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`inspect` reports storage internals without replacing a backup or integrity
|
|
99
|
+
verification:
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
rubydb inspect --database data/app.rdb --stats --wal
|
|
103
|
+
rubydb inspect --database data/app.rdb --pages --indexes
|
|
104
|
+
rubydb inspect --database data/app.rdb --table users
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Use `inspect --wal` to correlate WAL growth with checkpoint/backup incidents.
|
|
108
|
+
Do not edit files based on an inspection result; use the documented recovery
|
|
109
|
+
procedure.
|
|
110
|
+
|
|
111
|
+
## SQL shell
|
|
112
|
+
|
|
113
|
+
Open the configured local database shell:
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
rubydb shell --database app
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Output modes include `--table`, `--json`, and `--csv`. The shell supports these
|
|
120
|
+
dot-commands:
|
|
121
|
+
|
|
122
|
+
| Command | Purpose |
|
|
123
|
+
| --- | --- |
|
|
124
|
+
| `.help`, `.?` | Show shell help |
|
|
125
|
+
| `.exit`, `.quit` | Exit safely |
|
|
126
|
+
| `.status` | Show connection/database status |
|
|
127
|
+
| `.tables` | List tables |
|
|
128
|
+
| `.table NAME` | Describe columns and constraints |
|
|
129
|
+
| `.schema NAME` | Show a table definition |
|
|
130
|
+
| `.db NAME` | Switch configured local database |
|
|
131
|
+
| `.begin`, `.txn` | Begin a transaction |
|
|
132
|
+
| `.commit` | Commit the active transaction |
|
|
133
|
+
| `.rollback` | Roll back the active transaction |
|
|
134
|
+
| `.explain SQL` | Show the selected query plan |
|
|
135
|
+
| `.clear`, `.cls` | Clear the terminal |
|
|
136
|
+
|
|
137
|
+
Example:
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
users> .tables
|
|
141
|
+
users> SELECT id, email FROM users ORDER BY id LIMIT 20;
|
|
142
|
+
users> .begin
|
|
143
|
+
users> UPDATE users SET active = TRUE WHERE id = 1;
|
|
144
|
+
users> .rollback
|
|
145
|
+
users> .exit
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Use bound parameters from application/client APIs for untrusted values. The
|
|
149
|
+
shell is an administrative tool, not a connection-pool substitute. For
|
|
150
|
+
multiple application processes, use the managed server and client libraries;
|
|
151
|
+
never open one embedded path concurrently from independent processes.
|
|
152
|
+
|
|
153
|
+
## Migrations
|
|
154
|
+
|
|
155
|
+
Run migrations from the default `db/migrate` directory:
|
|
156
|
+
|
|
157
|
+
```sh
|
|
158
|
+
rubydb migrate --database data/app.rdb --path db/migrate
|
|
159
|
+
rubydb migrate --database data/app.rdb --path db/migrate --dry-run
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
To roll back, specify the number of steps and use a verified backup boundary:
|
|
163
|
+
|
|
164
|
+
```sh
|
|
165
|
+
rubydb migrate --database data/app.rdb --path db/migrate --down --steps 1
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
`--version VERSION` targets a migration version. Before applying migrations in
|
|
169
|
+
production, stop or coordinate writes, create a verified backup, test against a
|
|
170
|
+
populated restore, run schema dump/load and application smoke queries, and keep
|
|
171
|
+
the pre-migration directory until rollback closes. Applied migration checksum
|
|
172
|
+
changes fail closed.
|
|
173
|
+
|
|
174
|
+
## Backups and restore
|
|
175
|
+
|
|
176
|
+
Create a verified full backup:
|
|
177
|
+
|
|
178
|
+
```sh
|
|
179
|
+
rubydb backup --database data/app.rdb --dir backups --type full --compress
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
The supported types are `full`, `incremental`, and `differential`. Use
|
|
183
|
+
`--no-verify` only for controlled diagnostics; a release or production backup
|
|
184
|
+
should verify. Retain the manifest, checksum, database version, and required
|
|
185
|
+
WAL chain together.
|
|
186
|
+
|
|
187
|
+
List or dry-run a restore before changing a live path:
|
|
188
|
+
|
|
189
|
+
```sh
|
|
190
|
+
rubydb restore --dir backups --latest --dry-run
|
|
191
|
+
rubydb restore --database data/app.rdb --dir backups --backup BACKUP_NAME --dry-run
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Restore to a new inactive directory whenever possible. `--force` is destructive
|
|
195
|
+
and must not overwrite the only source. After restore, reopen the engine, verify
|
|
196
|
+
schema and row evidence, run application smoke queries, and record RPO/RTO.
|
|
197
|
+
Point-in-time restore uses `--point-in-time TIME` only when the required WAL
|
|
198
|
+
chain is present and verified.
|
|
199
|
+
|
|
200
|
+
## Snapshots
|
|
201
|
+
|
|
202
|
+
Snapshots are useful for staging, inspection, and branch workflows:
|
|
203
|
+
|
|
204
|
+
```sh
|
|
205
|
+
rubydb snapshot --database data/app.rdb --dir snapshots --name before-migration
|
|
206
|
+
rubydb snapshot --database data/app.rdb --dir snapshots --list
|
|
207
|
+
rubydb snapshot --database data/app.rdb --dir snapshots --restore before-migration
|
|
208
|
+
rubydb snapshot --database data/app.rdb --dir snapshots --delete old-snapshot
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Keep snapshot metadata/checksums and do not treat snapshots as the only backup.
|
|
212
|
+
Restore into a separate destination before routing traffic.
|
|
213
|
+
|
|
214
|
+
## Branches and database diff
|
|
215
|
+
|
|
216
|
+
List or create a branch:
|
|
217
|
+
|
|
218
|
+
```sh
|
|
219
|
+
rubydb branch --database data/app.rdb --branch-dir branches --list
|
|
220
|
+
rubydb branch --database data/app.rdb --branch-dir branches --create feature-x --from main
|
|
221
|
+
rubydb checkout --database data/app.rdb --branch-dir branches feature-x
|
|
222
|
+
rubydb checkout --database data/app.rdb --branch-dir branches --create experiment
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Review changes before merging:
|
|
226
|
+
|
|
227
|
+
```sh
|
|
228
|
+
rubydb diff --database data/app.rdb --branch-dir branches main feature-x
|
|
229
|
+
rubydb diff --database data/app.rdb --branch-dir branches --summary main feature-x
|
|
230
|
+
rubydb diff --database data/app.rdb --branch-dir branches --table users main feature-x
|
|
231
|
+
rubydb merge --database data/app.rdb --branch-dir branches feature-x --into main
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
`merge` supports the configured strategy and `--no-commit`. Take a verified
|
|
235
|
+
backup, review the diff, test the target with representative data, and preserve
|
|
236
|
+
the pre-merge state. Branches are not replication or backup replacements.
|
|
237
|
+
|
|
238
|
+
## Vacuum and maintenance
|
|
239
|
+
|
|
240
|
+
Preview maintenance first:
|
|
241
|
+
|
|
242
|
+
```sh
|
|
243
|
+
rubydb vacuum --database data/app.rdb --dry-run
|
|
244
|
+
rubydb vacuum --database data/app.rdb --table users
|
|
245
|
+
rubydb vacuum --database data/app.rdb --full --analyze
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Run full vacuum only during an approved maintenance window. Long-running
|
|
249
|
+
transactions may retain versions and prevent space reclamation. Monitor free
|
|
250
|
+
space, WAL/checkpoint behavior, query latency, and active transaction age.
|
|
251
|
+
|
|
252
|
+
## Production command sequences
|
|
253
|
+
|
|
254
|
+
### Pre-deployment
|
|
255
|
+
|
|
256
|
+
```sh
|
|
257
|
+
rubydb --config config/production.yml --env production doctor --quick --json
|
|
258
|
+
rubydb --config config/production.yml --env production status --json
|
|
259
|
+
rubydb backup --database /var/lib/rubydb/app.rdb --dir /var/backups/rubydb --type full --compress
|
|
260
|
+
rubydb migrate --database /var/lib/rubydb/app.rdb --path db/migrate --dry-run
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Incident preservation
|
|
264
|
+
|
|
265
|
+
Stop writes, preserve the database/WAL/log/configuration set, copy it to an
|
|
266
|
+
incident directory, and then use `doctor --quick`, `inspect --stats --wal`, and
|
|
267
|
+
the restore procedure. Do not use `drop --force`, `create --force`, or vacuum as
|
|
268
|
+
an attempted corruption repair.
|
|
269
|
+
|
|
270
|
+
### Release evidence
|
|
271
|
+
|
|
272
|
+
Archive command output with the RubyDB commit/version, Ruby version, OS,
|
|
273
|
+
database path class, workload, backup name/checksum, restore time, and operator.
|
|
274
|
+
The CLI is one part of the production evidence; CI, workload, failover, and
|
|
275
|
+
security review records are also required.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Architecture contribution guide
|
|
2
|
-
|
|
3
|
-
Before changing a core subsystem, identify its ownership, durability boundary,
|
|
4
|
-
failure behavior, and public compatibility contract. Changes to storage, WAL,
|
|
5
|
-
recovery, transactions, replication, protocol, or adapters need focused tests
|
|
6
|
-
and an end-to-end regression.
|
|
7
|
-
|
|
8
|
-
Document invariants in the relevant architecture page and add a lesson when a
|
|
9
|
-
new failure mode is discovered. Prefer explicit errors over silent fallback.
|
|
1
|
+
# Architecture contribution guide
|
|
2
|
+
|
|
3
|
+
Before changing a core subsystem, identify its ownership, durability boundary,
|
|
4
|
+
failure behavior, and public compatibility contract. Changes to storage, WAL,
|
|
5
|
+
recovery, transactions, replication, protocol, or adapters need focused tests
|
|
6
|
+
and an end-to-end regression.
|
|
7
|
+
|
|
8
|
+
Document invariants in the relevant architecture page and add a lesson when a
|
|
9
|
+
new failure mode is discovered. Prefer explicit errors over silent fallback.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
# Benchmarking guide
|
|
2
|
-
|
|
3
|
-
Run deterministic and concurrent workloads from the repository root:
|
|
4
|
-
|
|
5
|
-
```sh
|
|
6
|
-
RUBYDB_BENCHMARK_ITERATIONS=100 ruby -Ilib benchmarks/basic_workload.rb
|
|
7
|
-
RUBYDB_SOAK_THREADS=16 RUBYDB_SOAK_OPERATIONS=2000 ruby benchmarks/concurrent_soak.rb
|
|
8
|
-
RUBYDB_PRODUCTION_SOAK_CLIENTS=16 RUBYDB_PRODUCTION_SOAK_OPERATIONS=2000 ruby benchmarks/production_soak.rb
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Record commit, Ruby version, OS, CPU/memory/storage, dataset size, seed,
|
|
12
|
-
throughput, p50/p95/p99 latency, WAL growth, and recovery time. Benchmarks are
|
|
13
|
-
not universal capacity certification; compare against application-specific
|
|
14
|
-
limits and repeat after schema or runtime changes.
|
|
1
|
+
# Benchmarking guide
|
|
2
|
+
|
|
3
|
+
Run deterministic and concurrent workloads from the repository root:
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
RUBYDB_BENCHMARK_ITERATIONS=100 ruby -Ilib benchmarks/basic_workload.rb
|
|
7
|
+
RUBYDB_SOAK_THREADS=16 RUBYDB_SOAK_OPERATIONS=2000 ruby benchmarks/concurrent_soak.rb
|
|
8
|
+
RUBYDB_PRODUCTION_SOAK_CLIENTS=16 RUBYDB_PRODUCTION_SOAK_OPERATIONS=2000 ruby benchmarks/production_soak.rb
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Record commit, Ruby version, OS, CPU/memory/storage, dataset size, seed,
|
|
12
|
+
throughput, p50/p95/p99 latency, WAL growth, and recovery time. Benchmarks are
|
|
13
|
+
not universal capacity certification; compare against application-specific
|
|
14
|
+
limits and repeat after schema or runtime changes.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
# Development guide
|
|
2
|
-
|
|
3
|
-
Install dependencies with `bundle install`. Run focused specs while developing,
|
|
4
|
-
then run `bundle exec rspec` and `bundle exec rubocop` before opening a pull
|
|
5
|
-
request. Keep test databases in temporary directories and close engines in
|
|
6
|
-
`ensure` blocks.
|
|
7
|
-
|
|
8
|
-
Never use production data or secrets in local tests. Changes that affect a
|
|
9
|
-
stored format, SQL behavior, protocol, migration, or release process must update
|
|
10
|
-
the corresponding documentation and changelog.
|
|
11
|
-
|
|
12
|
-
For the complete change workflow, read the [developer guide](../developer-guide.md),
|
|
13
|
-
[debugging playbook](../debugging.md), and [testing guide](testing.md). Every
|
|
14
|
-
bug fix should include a regression test and an explanation of its invariant.
|
|
15
|
-
Run fault, concurrency, or recovery tests when the change crosses a durable
|
|
16
|
-
boundary; a unit test alone is not sufficient evidence.
|
|
1
|
+
# Development guide
|
|
2
|
+
|
|
3
|
+
Install dependencies with `bundle install`. Run focused specs while developing,
|
|
4
|
+
then run `bundle exec rspec` and `bundle exec rubocop` before opening a pull
|
|
5
|
+
request. Keep test databases in temporary directories and close engines in
|
|
6
|
+
`ensure` blocks.
|
|
7
|
+
|
|
8
|
+
Never use production data or secrets in local tests. Changes that affect a
|
|
9
|
+
stored format, SQL behavior, protocol, migration, or release process must update
|
|
10
|
+
the corresponding documentation and changelog.
|
|
11
|
+
|
|
12
|
+
For the complete change workflow, read the [developer guide](../developer-guide.md),
|
|
13
|
+
[debugging playbook](../debugging.md), and [testing guide](testing.md). Every
|
|
14
|
+
bug fix should include a regression test and an explanation of its invariant.
|
|
15
|
+
Run fault, concurrency, or recovery tests when the change crosses a durable
|
|
16
|
+
boundary; a unit test alone is not sufficient evidence.
|