Backup CRRestore CRMariaDB instancesmysql.global_privLOCK TABLESMariaDB running in KubernetesMariaDB with different topologyMariaDBsMariaDBsPods restarting after bootstrapping from a backupgalera-0, galera-1 and galera-2.apiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
storage:
persistentVolumeClaim:
resources:
requests:
storage: 100Mi
accessModes:
- ReadWriteOnceapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
storage:
s3:
bucket: backups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
region: us-east-1
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: tls.crtapiVersion: v1
kind: ServiceAccount
metadata:
name: mariadb-backup
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<<account_id>>:role/my-role-irsaapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
serviceAccountName: mariadb-backup
storage:
s3:
bucket: backups
prefix: mariadb
endpoint: s3.us-east-1.amazonaws.com
region: us-east-1
tls:
enabled: trueapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
schedule:
cron: "*/1 * * * *"
suspend: falseapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
maxRetention: 720h # 30 daysapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
compression: gzipapiVersion: v1
kind: Secret
type: Opaque
metadata:
name: ssec-key
stringData:
# 32-byte key encoded in base64 (use: openssl rand -base64 32)
customer-key: YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY=apiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
storage:
s3:
bucket: backups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
region: us-east-1
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: tls.crt
ssec:
customerKeySecretKeyRef:
name: ssec-key
key: customer-keyapiVersion: enterprise.mariadb.com/v1alpha1
kind: Restore
metadata:
name: restore
spec:
mariaDbRef:
name: mariadb
backupRef:
name: backupapiVersion: enterprise.mariadb.com/v1alpha1
kind: Restore
metadata:
name: restore
spec:
mariaDbRef:
name: mariadb
s3:
bucket: backups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
region: us-east-1
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: tls.crtapiVersion: enterprise.mariadb.com/v1alpha1
kind: Restore
metadata:
name: restore
spec:
mariaDbRef:
name: mariadb
backupRef:
name: backup
targetRecoveryTime: 2023-12-19T09:00:00ZapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-from-backup
spec:
storage:
size: 1Gi
bootstrapFrom:
backupRef:
name: backup
targetRecoveryTime: 2023-12-19T09:00:00ZapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-from-backup
spec:
storage:
size: 1Gi
bootstrapFrom:
s3:
bucket: backups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: tls.crt
targetRecoveryTime: 2023-12-19T09:00:00ZapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
databases:
- db1
- db2
- db3apiVersion: enterprise.mariadb.com/v1alpha1
kind: Restore
metadata:
name: restore
spec:
mariaDbRef:
name: mariadb
backupRef:
name: backup
database: db1apiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
args:
- --verboseapiVersion: enterprise.mariadb.com/v1alpha1
kind: Restore
metadata:
name: restore
spec:
mariaDbRef:
name: mariadb
backupRef:
name: backup
args:
- --verboseapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
storage:
s3:
...
stagingStorage:
persistentVolumeClaim:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnceapiVersion: enterprise.mariadb.com/v1alpha1
kind: Restore
metadata:
name: restore
spec:
s3:
...
stagingStorage:
persistentVolumeClaim:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnceapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb
spec:
bootstrapFrom:
s3:
...
stagingStorage:
persistentVolumeClaim:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnceapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb
spec:
storage:
size: 1Gi
bootstrapFrom:
restoreJob:
args:
- --verbose
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 1GiapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup
spec:
mariaDbRef:
name: mariadb
ignoreGlobalPriv: falsemariadb-dump --user=${MARIADB_USER} --password=${MARIADB_PASSWORD} --host=${MARIADB_HOST} --single-transaction --events --routines --all-databases > backup.2024-08-26T12:24:34Z.sqlmariadb-dump --user=${MARIADB_USER} --password=${MARIADB_PASSWORD} --host=${MARIADB_HOST} --single-transaction --events --routines --all-databases --skip-add-locks --ignore-table=mysql.global_priv > backup.2024-08-26T12:24:34Z.sqlapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-galera
spec:
rootPasswordSecretKeyRef:
name: mariadb
key: root-password
replicas: 3
galera:
enabled: true
storage:
size: 1Gi
bootstrapFrom:
s3:
bucket: backups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: tls.crt
targetRecoveryTime: 2024-08-26T12:24:34ZapiVersion: enterprise.mariadb.com/v1alpha1
kind: Backup
metadata:
name: backup-standalone
spec:
mariaDbRef:
name: mariadb-standalone
ignoreGlobalPriv: trueapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-galera
spec:
replicas: 3
galera:
enabled: true
storage:
size: 1Gi
bootstrapFrom:
backupRef:
name: backup-standaloneProcedures for configuring automated and on-demand backups using MariaDB Enterprise Backup, including restoration steps to recover data.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: blob-fuse
provisioner: blob.csi.azure.com
parameters:
protocol: fuse2
reclaimPolicy: Retain
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
# Resolves the issue where non-root containers cannot access the mounted blob container.
- -o allow_other
# Ensures list operations (critical for backups/deletion) work immediately upon mount.
- --cancel-list-on-mount-seconds=0-o allow_other)--cancel-list-on-mount-seconds=0)apiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
# ...
storage:
persistentVolumeClaim:
# Specify your own class
storageClassName: blob-fuseVolumeSnapshotsJobReadWriteOncePod access mode partially supportedPhysicalBackup Jobs schedulingmariadb-backup log copy incomplete: consider increasing innodb_log_file_sizemariadb-backup Job fails to start because the Pod cannot mount MariaDB PVC created with StorageClass providertruePhysicalBackupapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
storage:
volumeSnapshot:
volumeSnapshotClassName: csi-hostpath-snapclassapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
storage:
s3:
bucket: physicalbackups
endpoint: minio.minio.svc.cluster.local:9000
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crtapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
waitForIt: true
schedule:
cron: "*/1 * * * *"
suspend: false
immediate: true
onDemand: "1"
onPrimaryChange: true apiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
compression: bzip2apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: ssec-key
stringData:
# 32-byte key encoded in base64 (use: openssl rand -base64 32)
customer-key: YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY=apiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
storage:
s3:
bucket: physicalbackups
endpoint: minio.minio.svc.cluster.local:9000
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crt
ssec:
customerKeySecretKeyRef:
name: ssec-key
key: customer-keyapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
maxRetention: 720h # 30 daysapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
target: ReplicaapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-galera
spec:
bootstrapFrom:
backupRef:
name: physicalbackup
kind: PhysicalBackupapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-galera
spec:
bootstrapFrom:
s3:
bucket: physicalbackups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crt
backupContentType: PhysicalapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-galera
spec:
bootstrapFrom:
volumeSnapshotRef:
name: physicalbackup-20250611163352apiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-galera
spec:
bootstrapFrom:
targetRecoveryTime: 2025-06-17T08:07:00ZapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
timeout: 2hapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
logLevel: debugapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
args:
- "--verbose"---
apiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
target: Replica
compression: bzip2
storage:
azureBlob:
containerName: physicalbackup
serviceURL: https://physicalbackup.blob.core.windows.net # Format is: `https://%s.blob.core.windows.net/` where `%s` is the containerName
prefix: mariadb
storageAccountName: exampleStorageAccount
storageAccountKey:
name: azurite-key
key: storageAccountKey
# Optional.
# tls:
# enabled: true
# caSecretKeyRef:
# name: azurite-certs
# key: cert.pemapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
storage:
s3:
bucket: physicalbackups
endpoint: minio.minio.svc.cluster.local:9000
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crtapiVersion: v1
kind: ServiceAccount
metadata:
name: mariadb-backup
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::<<account_id>>:role/my-role-irsaapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
serviceAccountName: mariadb-backup
storage:
s3:
bucket: physicalbackups
prefix: mariadb
endpoint: s3.us-east-1.amazonaws.com
region: us-east-1
tls:
enabled: trueapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
storage:
s3:
bucket: physicalbackups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
region: us-east-1
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crt
stagingStorage:
persistentVolumeClaim:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteOnceapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-galera
spec:
mariaDbRef:
name: mariadb
bootstrapFrom:
s3:
bucket: physicalbackups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crt
backupContentType: Physical
stagingStorage:
persistentVolumeClaim:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteOnceapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb
spec:
bootstrapFrom:
restoreJob:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 1GiapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
mariaDbRef:
name: mariadb
podAffinity: falsekubectl get physicalbackups
NAME COMPLETE STATUS MARIADB LAST SCHEDULED AGE
physicalbackup True Success mariadb 17s 17skubectl get physicalbackups physicalbackup -o json | jq -r '.status'
{
"conditions": [
{
"lastTransitionTime": "2025-07-14T07:01:14Z",
"message": "Success",
"reason": "JobComplete",
"status": "True",
"type": "Complete"
}
],
"lastScheduleCheckTime": "2025-07-14T07:00:00Z",
"lastScheduleTime": "2025-07-14T07:00:00Z",
"nextScheduleTime": "2025-07-15T07:00:00Z"
}kubectl get events --field-selector involvedObject.name=physicalbackup
LAST SEEN TYPE REASON OBJECT MESSAGE
116s Normal WaitForFirstConsumer persistentvolumeclaim/physicalbackup waiting for first consumer to be created before binding
116s Normal JobScheduled physicalbackup/physicalbackup Job physicalbackup-20250714140837 scheduled
116s Normal ExternalProvisioning persistentvolumeclaim/physicalbackup Waiting for a volume to be created either by the external provisioner 'rancher.io/local-path' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
116s Normal Provisioning persistentvolumeclaim/physicalbackup External provisioner is provisioning volume for claim "default/physicalbackup"
113s Normal ProvisioningSucceeded persistentvolumeclaim/physicalbackup Successfully provisioned volume pvc-7b7c71f9-ea7e-4950-b612-2d41d7ab35b7mariadb [00] 2025-08-04 09:15:57 Was only able to copy log from 58087 to 59916, not 68968; try increasing
innodb_log_file_size
mariadb mariabackup: Stopping log copying thread.[00] 2025-08-04 09:15:57 Retrying read of log at LSN=59916apiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb
spec:
...
myCnf: |
[mariadb]
innodb_log_file_size=200MrestoreJob: Compute resources and metadata configuration for the restoration job. To reduce RTO, it is recommended to properly tune compute resources.apiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup-daily
spec:
mariaDbRef:
name: mariadb-repl
schedule:
cron: "0 0 * * *"
suspend: false
immediate: true
compression: bzip2
maxRetention: 720h
storage:
s3:
bucket: physicalbackups
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
region: us-east-1
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crtapiVersion: enterprise.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
name: pitr
spec:
physicalBackupRef:
name: physicalbackup-daily
storage:
s3:
bucket: binlogs
prefix: mariadb
endpoint: minio.minio.svc.cluster.local:9000
region: us-east-1
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crt
compression: gzip
archiveTimeout: 1h
archiveInterval: 1m
maxParallel: 4
maxRetention: 720h # 30 days
strictMode: falseapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-repl
spec:
storage:
size: 1Gi
replicas: 3
replication:
enabled: true
# sidecar agent will archive binary logs to the configured storage.
pointInTimeRecoveryRef:
name: pitrapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-repl
spec:
storage:
size: 1Gi
replicas: 3
replication:
enabled: true
# bootstrap the instance from PITR: restore closest physical backup and replay binary logs up to targetRecoveryTime.
bootstrapFrom:
pointInTimeRecoveryRef:
name: pitr
targetRecoveryTime: 2026-02-20T18:00:04ZapiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
schedule:
onPrimaryChange: true apiVersion: enterprise.mariadb.com/v1alpha1
kind: PhysicalBackup
metadata:
name: physicalbackup
spec:
schedule:
cron: "0 0 * * *"
onDemand: "1"apiVersion: enterprise.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
name: pitr
spec:
archiveTimeout: 1h
archiveInterval: 1mkubectl logs -l enterprise.mariadb.com/role=primary -c agent --tail 20
{"level":"info","ts":1772208238.0152433,"logger":"binlog-archival","msg":"Archiving binary logs"}
{"level":"info","ts":1772208238.437027,"logger":"binlog-archival.uploader","msg":"Uploading binary log","binlog":"mariadb-repl-bin.000003","object":"server-10/mariadb-repl-bin.000003.gz","start-time":"2026-02-27T16:03:58Z"}
{"level":"info","ts":1772208238.4371545,"logger":"binlog-archival.uploader","msg":"Compressing binary log","binlog":"mariadb-repl-bin.000003","object":"server-10/mariadb-repl-bin.000003.gz","start-time":"2026-02-27T16:03:58Z"}
{"level":"info","ts":1772208260.8291402,"logger":"binlog-archival.uploader","msg":"Binary log uploaded","binlog":"mariadb-repl-bin.000003","object":"server-10/mariadb-repl-bin.000003.gz","start-time":"2026-02-27T16:03:58Z","total-time":"22.392211226s"}
{"level":"info","ts":1772208260.8621385,"logger":"binlog-archival","msg":"Binary log mariadb-repl-bin.000003 archived"}
{"level":"info","ts":1772208260.8622391,"logger":"binlog-archival","msg":"Binlog archival done"}
{"level":"info","ts":1772208261.2485638,"logger":"binlog-archival","msg":"Purging binary logs","max-retention":"720h0m0s"}
{"level":"info","ts":1772208261.2599053,"logger":"binlog-archival","msg":"Binary logs purged","max-retention":"720h0m0s"}
{"level":"info","ts":1772208268.0053742,"logger":"binlog-archival","msg":"Archiving binary logs"}
{"level":"info","ts":1772208268.0907545,"logger":"binlog-archival.uploader","msg":"Uploading binary log","binlog":"mariadb-repl-bin.000004","object":"server-10/mariadb-repl-bin.000004.gz","start-time":"2026-02-27T16:04:28Z"}
{"level":"info","ts":1772208268.0908031,"logger":"binlog-archival.uploader","msg":"Compressing binary log","binlog":"mariadb-repl-bin.000004","object":"server-10/mariadb-repl-bin.000004.gz","start-time":"2026-02-27T16:04:28Z"}
{"level":"info","ts":1772208279.7613757,"logger":"binlog-archival.uploader","msg":"Binary log uploaded","binlog":"mariadb-repl-bin.000004","object":"server-10/mariadb-repl-bin.000004.gz","start-time":"2026-02-27T16:04:28Z","total-time":"11.670631252s"}
{"level":"info","ts":1772208279.7794006,"logger":"binlog-archival","msg":"Binary log mariadb-repl-bin.000004 archived"}
{"level":"info","ts":1772208279.7794523,"logger":"binlog-archival","msg":"Binlog archival done"}
kubectl get events --field-selector involvedObject.name=mariadb-repl
LAST SEEN TYPE REASON OBJECT MESSAGE
4m3s Normal BinlogArchived MariaDB/mariadb-repl Binary log mariadb-repl-bin.000001 archived
2m36s Normal BinlogArchived MariaDB/mariadb-repl Binary log mariadb-repl-bin.000002 archived
2m11s Normal BinlogArchived MariaDB/mariadb-repl Binary log mariadb-repl-bin.000003 archived
112s Normal BinlogArchived MariaDB/mariadb-repl Binary log mariadb-repl-bin.000004 archived
kubectl get mariadb mariadb-repl -o jsonpath='{.status.pointInTimeRecovery}' | jq
{
"lastArchivedBinaryLog": "mariadb-repl-bin.000004",
"lastArchivedGtid": "0-10-1559",
"lastArchivedPosition": 268506819,
"lastArchivedTime": "2026-02-27T16:04:15Z",
"serverId": 10,
"storageReadyForArchival": true
}apiVersion: enterprise.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
name: pitr
spec:
compression: gzipapiVersion: v1
kind: Secret
type: Opaque
metadata:
name: ssec-key
stringData:
# 32-byte key encoded in base64 (use: openssl rand -base64 32)
customer-key: YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY=apiVersion: enterprise.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
name: pitr
spec:
physicalBackupRef:
name: physicalbackup-daily
storage:
s3:
bucket: binlogs
endpoint: minio.minio.svc.cluster.local:9000
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crt
ssec:
customerKeySecretKeyRef:
name: ssec-key
key: customer-keyapiVersion: enterprise.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
name: pitr
spec:
maxParallel: 4apiVersion: enterprise.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
name: pitr
spec:
maxRetention: 720h # 30 daysapiVersion: v1
binlogs:
server-10:
...
- binlogFilename: mariadb-repl-bin.000003
binlogVersion: 4
firstGtid: 0-10-527
firstTime: "2026-02-27T16:03:22Z"
lastGtid: 0-10-1041
lastTime: "2026-02-27T16:03:50Z"
logPosition: 268493636
previousGtids:
- 0-10-526
rotateEvent: true
serverId: 10
serverVersion: 11.8.5-2-MariaDB-enterprise-log
stopEvent: false
- binlogFilename: mariadb-repl-bin.000004
binlogVersion: 4
firstGtid: 0-10-1042
firstTime: "2026-02-27T16:03:50Z"
lastGtid: 0-10-1559
lastTime: "2026-02-27T16:04:15Z"
logPosition: 268506819
previousGtids:
- 0-10-1041
rotateEvent: true
serverId: 10
serverVersion: 11.8.5-2-MariaDB-enterprise-log
stopEvent: falsekubectl get pitr
NAME PHYSICAL BACKUP LAST RECOVERABLE TIME STRICT MODE AGE
pitr physicalbackup-daily 2026-02-27T20:10:42Z true 43hkubectl get pitr
NAME PHYSICAL BACKUP LAST RECOVERABLE TIME STRICT MODE AGE
pitr physicalbackup-daily 2026-02-27T20:10:42Z true 43hapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-repl
spec:
rootPasswordSecretKeyRef:
name: mariadb
key: root-password
storage:
size: 1Gi
replicas: 3
replication:
enabled: true
# bootstrap the instance from PITR: restore closest physical backup and replay binary logs up to targetRecoveryTime.
bootstrapFrom:
pointInTimeRecoveryRef:
name: pitr
targetRecoveryTime: 2026-02-20T18:00:04Z
restoreJob:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 1Gi
logLevel: debugkubectl apply -f mariadb_replication_pitr_s3.yaml
mariadb.enterprise.mariadb.com/mariadb-repl created
kubectl get mariadb
NAME READY STATUS PRIMARY UPDATES AGE
mariadb-repl False Initializing mariadb-repl-0 ReplicasFirstPrimaryLast 40s
kubectl get pods
NAME READY STATUS RESTARTS AGE
mariadb-repl-0 2/2 Running 0 36s
mariadb-repl-0-pb-init-gp4gl 0/1 Completed 0 45s
mariadb-repl-1 1/2 Running 0 15s
mariadb-repl-1-pb-init-z44d7 0/1 Completed 0 27s
mariadb-repl-2-pb-init-qmkcv 0/1 Completed 0 8s
kubectl get mariadb
NAME READY STATUS PRIMARY UPDATES AGE
mariadb-repl False Replaying binlogs mariadb-repl-0 ReplicasFirstPrimaryLast 93s
kubectl get pods
NAME READY STATUS RESTARTS AGE
mariadb-repl-0 2/2 Running 0 84s
mariadb-repl-1 2/2 Running 0 58s
mariadb-repl-2 2/2 Running 0 38s
mariadb-repl-pitr-pj6fr 0/1 Init:0/1 0 8s
kubectl logs mariadb-repl-pitr-pj6fr -c mariadb-enterprise-operator
{"level":"info","ts":1772294432.9904623,"msg":"Starting point-in-time recovery"}
{"level":"info","ts":1772294432.9907954,"msg":"Getting binlog index from object storage"}
{"level":"info","ts":1772294432.9951825,"msg":"Building binlog timeline"}
{"level":"info","ts":1772294432.9952044,"logger":"binlog-timeline","msg":"Building binlog timeline","num-binlogs":0,"start-gtid":"0-10-4","target-time":"2026-02-27T21:10:42+01:00","strict-mode":false,"server":"server-10"}
{"level":"info","ts":1772294432.9952517,"msg":"Got binlog timeline","path":["server-10/mariadb-repl-bin.000002","server-10/mariadb-repl-bin.000003","server-10/mariadb-repl-bin.000004","server-10/mariadb-repl-bin.000005"]}
{"level":"info","ts":1772294432.9952574,"msg":"Pulling binlogs into staging area","staging-path":"/binlogs","compression":"gzip"}
{"level":"info","ts":1772294432.9952772,"logger":"storage","msg":"Pulling binlog","binlog":"server-10/mariadb-repl-bin.000005","start-time":"2026-02-28T16:00:32Z"}
{"level":"info","ts":1772294432.9967375,"logger":"storage","msg":"Decompressing binlog","binlog":"server-10/mariadb-repl-bin.000005","start-time":"2026-02-28T16:00:32Z","compressed-file":"server-10/mariadb-repl-bin.000005.gz","decompressed-file":"/binlogs/server-10/mariadb-repl-bin.000005","compression":"gzip"}
{"level":"info","ts":1772294437.3718772,"msg":"Binlogs pulled into staging area","staging-path":"/binlogs","compression":"gzip"}
{"level":"info","ts":1772294437.3719199,"msg":"Writing target file","file-path":"/binlogs/0-binlog-target.txt"}kubectl get mariadb mariadb-repl -o jsonpath='{.status.conditions}' | jq
[
{
"lastTransitionTime": "2026-03-01T12:15:06Z",
"message": "Initialized",
"reason": "Initialized",
"status": "True",
"type": "Initialized"
},
{
"lastTransitionTime": "2026-03-01T12:15:06Z",
"message": "Restored physical backup",
"reason": "RestorePhysicalBackup",
"status": "True",
"type": "BackupRestored"
},
{
"lastTransitionTime": "2026-03-01T12:15:06Z",
"message": "Replication configured",
"reason": "ReplicationConfigured",
"status": "True",
"type": "ReplicationConfigured"
},
{
"lastTransitionTime": "2026-03-01T12:16:40Z",
"message": "Replayed binlogs",
"reason": "ReplayBinlogs",
"status": "True",
"type": "BinlogsReplayed"
},
]apiVersion: enterprise.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
name: pitr
spec:
strictMode: truekubectl get pitr
NAME PHYSICAL BACKUP LAST RECOVERABLE TIME STRICT MODE AGE
pitr physicalbackup-daily 2026-02-27T20:10:42Z true 43hapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-repl
spec:
rootPasswordSecretKeyRef:
name: mariadb
key: root-password
storage:
size: 1Gi
replicas: 3
replication:
enabled: true
bootstrapFrom:
pointInTimeRecoveryRef:
name: pitr
targetRecoveryTime: 2026-02-28T20:10:42Zkubectl get events --field-selector involvedObject.name=mariadb-repl
LAST SEEN TYPE REASON OBJECT MESSAGE
41s Warning MariaDBInitError mariadb/mariadb-repl Unable to init MariaDB: target recovery time 2026-02-28 21:10:42 +0100 CET is after latest recoverable time 2026-02-27 20:10:42 +0000 UTC
kubectl get mariadb
NAME READY STATUS PRIMARY UPDATES AGE
mariadb-repl False Init error: target recovery time 2026-02-28 21:10:42 +0100 CET is after latest recoverable time 2026-02-27 20:10:42 +0000 UTC mariadb-repl-0 ReplicasFirstPrimaryLast 65skubectl get pitr
NAME PHYSICAL BACKUP LAST RECOVERABLE TIME STRICT MODE AGE
pitr physicalbackup-daily 2026-02-27T20:10:42Z false 43hkubectl get events --field-selector involvedObject.name=mariadb-repl
LAST SEEN TYPE REASON OBJECT MESSAGE
12s Warning BinlogTimelineInvalid mariadb/mariadb-repl Invalid binary log timeline: error getting binlog timeline between GTID 0-10-4 and target time 2026-02-28T21:10:42+01:00: timeline did not reach target time: 2026-02-28T21:10:42+01:00, last recoverable time: 2026-02-27T21:10:42+01:00
kubectl get mariadb
NAME READY STATUS PRIMARY UPDATES AGE
mariadb-repl False Error replaying binlogs: Invalid binary log timeline: error getting binlog timeline between GTID 0-10-4 and target time 2026-02-28T21:10:42+01:00: timeline did not reach target time: 2026-02-28T21:10:42+01:00, last recoverable time: 2026-02-27T21:10:42+01:00 mariadb-repl-0 ReplicasFirstPrimaryLast 3m28sapiVersion: enterprise.mariadb.com/v1alpha1
kind: MariaDB
metadata:
name: mariadb-repl
spec:
bootstrapFrom:
stagingStorage:
persistentVolumeClaim:
storageClassName: my-storage-class
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOncekubectl get mariadb mariadb-repl -o jsonpath='{.status.pointInTimeRecovery}' | jq
{
"lastArchivedBinaryLog": "mariadb-repl-bin.000001",
"lastArchivedPosition": 358,
"lastArchivedTime": "2026-03-02T11:14:00Z",
"serverId": 10,
"storageReadyForArchival": true
}kubectl get mariadb mariadb-repl -o jsonpath="{.status.conditions}" | jq
[
{
"lastTransitionTime": "2026-03-02T11:33:58Z",
"message": "Archived binlogs",
"reason": "ArchiveBinlogs",
"status": "True",
"type": "BinlogsArchived"
},
{
"lastTransitionTime": "2026-03-01T12:16:40Z",
"message": "Replayed binlogs",
"reason": "ReplayBinlogs",
"status": "True",
"type": "BinlogsReplayed"
},
]kubectl get events --field-selector involvedObject.name=mariadb-repl --sort-by='.lastTimestamp'
24m Warning BinlogArchivalError mariadb/mariadb-repl Error archiving binary logs: 1 error occurred:...
23m Normal BinlogArchived mariadb/mariadb-repl Binary log mariadb-repl-bin.000001 archived
41s Warning MariaDBInitError mariadb/mariadb-repl Unable to init MariaDB: target recovery time 2026-02-28 21:10:42 +0100 CET is after latest recoverable time 2026-02-27 20:10:42 +0000 UTC
12s Warning BinlogTimelineInvalid mariadb/mariadb-repl Invalid binary log timeline: error getting binlog timeline between GTID 0-10-4 and target time 2026-02-28T21:10:42+01:00: timeline did not reach target time: 2026-02-28T21:10:42+01:00, last recoverable time: 2026-02-27T21:10:42+01:00kubectl get mariadb mariadb-repl -o jsonpath="{.status}" | jq
{
"conditions": [
{
"lastTransitionTime": "2026-03-02T11:14:58Z",
"message": "Error archiving binlogs: 1 error occurred:\n\t* binary log storage is not ready for archival. Archival must start from a clean state\n\n",
"reason": "ArchiveBinlogsError",
"status": "False",
"type": "Ready"
},
{
"lastTransitionTime": "2026-03-02T11:14:58Z",
"message": "Error archiving binlogs: 1 error occurred:\n\t* binary log storage is not ready for archival. Archival must start from a clean state\n\n",
"reason": "ArchiveBinlogsError",
"status": "False",
"type": "BinlogsArchived"
}
],
}apiVersion: enterprise.mariadb.com/v1alpha1
kind: PointInTimeRecovery
metadata:
name: pitr
spec:
physicalBackupRef:
name: physicalbackup-daily
storage:
s3:
bucket: binlogs
prefix: mariadb-v2 # previously it was "mariadb"
endpoint: minio.minio.svc.cluster.local:9000
region: us-east-1
accessKeyIdSecretKeyRef:
name: minio
key: access-key-id
secretAccessKeySecretKeyRef:
name: minio
key: secret-access-key
tls:
enabled: true
caSecretKeyRef:
name: minio-ca
key: ca.crtkubectl get pitr
NAME PHYSICAL BACKUP LAST RECOVERABLE TIME STRICT MODE AGE
pitr physicalbackup-daily 2026-02-27T20:10:42Z true 43h
kubectl get mariadb
NAME READY STATUS PRIMARY UPDATES AGE
mariadb-repl False Init error: target recovery time 2026-02-28 21:10:42 +0100 CET is after latest recoverable time 2026-02-27 20:10:42 +0000 UTC mariadb-repl-0 ReplicasFirstPrimaryLast 65sapiVersion: v1
binlogs:
server-10:
...
- binlogFilename: mariadb-repl-bin.000003
binlogVersion: 4
firstGtid: 0-10-527
firstTime: "2026-02-27T16:03:22Z"
lastGtid: 0-10-1041
lastTime: "2026-02-27T16:03:50Z"
logPosition: 268493636
previousGtids:
- 0-10-526
rotateEvent: true
serverId: 10
serverVersion: 11.8.5-2-MariaDB-enterprise-log
stopEvent: false
- binlogFilename: mariadb-repl-bin.000004
binlogVersion: 4
firstGtid: 0-10-1042
firstTime: "2026-02-27T16:03:50Z"
lastGtid: 0-10-1559
lastTime: "2026-02-27T16:04:15Z"
logPosition: 268506819
previousGtids:
- 0-10-1041
rotateEvent: true
serverId: 10
serverVersion: 11.8.5-2-MariaDB-enterprise-log
stopEvent: falsekubectl get mariadb
NAME READY STATUS PRIMARY UPDATES AGE
mariadb-repl False Error replaying binlogs: Invalid binary log timeline: error getting binlog timeline between GTID 0-10-4 and target time 2026-02-28T21:10:42+01:00: timeline did not reach target time: 2026-02-28T21:10:42+01:00, last recoverable time: 2026-02-27T16:04:15Z mariadb-repl-0 ReplicasFirstPrimaryLast 3m28s