{"record":{"id":"85553d9d60f79e31","repo":"vitessio/vitess","slug":"partial-row-image-encountered-ensure-binlog-row-i","errorCode":null,"errorMessage":"partial row image encountered: ensure binlog_row_image is set to 'full'","messagePattern":"partial row image encountered: ensure binlog_row_image is set to 'full'","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/vt/vttablet/tabletserver/vstreamer/vstreamer.go","lineNumber":1334,"sourceCode":"\treturn nil\n}\n\nfunc (vs *vstreamer) getValues(plan *streamerPlan, data []byte,\n\tdataColumns, nullColumns mysql.Bitmap, jsonPartialValues mysql.Bitmap,\n) ([]sqltypes.Value, []collations.ID, bool, error) {\n\tif len(data) == 0 {\n\t\treturn nil, nil, false, nil\n\t}\n\tvalues := make([]sqltypes.Value, dataColumns.Count())\n\tcharsets := make([]collations.ID, len(values))\n\tvalueIndex := 0\n\tjsonIndex := 0\n\tpos := 0\n\tpartial := false\n\tfor colNum := 0; colNum < dataColumns.Count(); colNum++ {\n\t\tif !dataColumns.Bit(colNum) {\n\t\t\tif vs.config.ExperimentalFlags /**/ & /**/ vttablet.VReplicationExperimentalFlagAllowNoBlobBinlogRowImage == 0 {\n\t\t\t\treturn nil, nil, false, errors.New(\"partial row image encountered: ensure binlog_row_image is set to 'full'\")\n\t\t\t} else {\n\t\t\t\tpartial = true\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif nullColumns.Bit(valueIndex) {\n\t\t\tvalueIndex++\n\t\t\tif plan.Table.Fields[colNum].Type == querypb.Type_JSON {\n\t\t\t\tjsonIndex++\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tpartialJSON := false\n\t\tif jsonPartialValues.Count() > 0 && plan.Table.Fields[colNum].Type == querypb.Type_JSON {\n\t\t\tpartialJSON = jsonPartialValues.Bit(jsonIndex)\n\t\t\tjsonIndex++\n\t\t}\n\t\tvalue, l, err := mysqlbinlog.CellValue(data, pos, plan.TableMap.Types[colNum], plan.TableMap.Metadata[colNum], plan.Table.Fields[colNum], partialJSON)","sourceCodeStart":1316,"sourceCodeEnd":1352,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/vttablet/tabletserver/vstreamer/vstreamer.go#L1316-L1352","documentation":"A binlog row event arrived with a partial row image (some columns missing from the BINLOG row), which vstreamer cannot decode into full row values unless the experimental no-blob row image flag is enabled. MySQL's binlog_row_image=MINIMAL emits only changed/PK columns, leaving getValues unable to reconstruct the complete row. The error tells the operator to switch the source to binlog_row_image=FULL.","triggerScenarios":"Source MySQL is configured with binlog_row_image=MINIMAL or NOBLOB while a VReplication stream processes row events on tables where not all columns are present in the binlog, and VReplicationExperimentalFlagAllowNoBlobBinlogRowImage is not set in vttablet.","commonSituations":"Operators minimizing binlog disk usage on the source; replication setups inherited from non-Vitess tooling with MINIMAL row image defaults; moving tables whose blobs were trimmed from the row image.","solutions":["Set binlog_row_image=FULL on the source MySQL and restart the stream (SET GLOBAL binlog_row_image='FULL' then RESET/refresh the workflow)","Enable the experimental flag VReplicationExperimentalFlagAllowNoBlobBinlogRowImage on vttablet if partial images are acceptable","Verify with SELECT @@binlog_row_image on the source before starting vreplication workflows"],"exampleFix":"-- before\nSHOW VARIABLES LIKE 'binlog_row_image'; -- MINIMAL\n-- after\nSET GLOBAL binlog_row_image = 'FULL';\n-- then restart the workflow\nvtctldclient Workflow --keyspace ks moveTables --workflow mt1 start","handlingStrategy":"validation","validationCode":"-- run before starting any vreplication workflow against this source\nSHOW VARIABLES LIKE 'binlog_row_image'; -- must be FULL","typeGuard":null,"tryCatchPattern":"if _, _, _, err := vs.getValues(...); err != nil {\n\tif strings.Contains(err.Error(), \"partial row image\") {\n\t\t// alert operator to set binlog_row_image=FULL on the source\n\t}\n\treturn err\n}","preventionTips":["Set binlog_row_image=FULL on all replication sources","Only use the experimental AllowNoBlobBinlogRowImage flag deliberately","Re-check the variable after MySQL upgrades or config migrations"],"tags":["vreplication","mysql","binlog","configuration"],"backgroundTag":"partial-binlog-row-image","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}