Skip to content

Commit 722139d

Browse files
committed
DM: Improve checker to support newer MariaDB versions
1 parent 25b0038 commit 722139d

File tree

7 files changed

+105
-384
lines changed

7 files changed

+105
-384
lines changed

dm/checker/checker.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ func (c *Checker) Init(ctx context.Context) (err error) {
304304
c.checkList = append(c.checkList, checker.NewTargetPrivilegeChecker(
305305
c.instances[0].targetDB.DB,
306306
c.instances[0].targetDBInfo,
307+
c.instances[0].targetDB.Version,
307308
))
308309
}
309310
// sourceID -> DB
@@ -334,6 +335,7 @@ func (c *Checker) Init(ctx context.Context) (err error) {
334335
c.checkList = append(c.checkList, checker.NewSourceDumpPrivilegeChecker(
335336
instance.sourceDB.DB,
336337
instance.sourceDBinfo,
338+
instance.sourceDB.Version,
337339
info.sourceID2SourceTables[sourceID],
338340
exportCfg.Consistency,
339341
c.dumpWholeInstance,
@@ -364,7 +366,7 @@ func (c *Checker) Init(ctx context.Context) (err error) {
364366
c.checkList = append(c.checkList, checker.NewMySQLBinlogRowImageChecker(instance.sourceDB.DB, instance.sourceDBinfo))
365367
}
366368
if _, ok := c.checkingItems[config.ReplicationPrivilegeChecking]; ok {
367-
c.checkList = append(c.checkList, checker.NewSourceReplicationPrivilegeChecker(instance.sourceDB.DB, instance.sourceDBinfo))
369+
c.checkList = append(c.checkList, checker.NewSourceReplicationPrivilegeChecker(instance.sourceDB.DB, instance.sourceDBinfo, instance.sourceDB.Version))
368370
}
369371
if _, ok := c.checkingItems[config.OnlineDDLChecking]; c.onlineDDL != nil && ok {
370372
c.checkList = append(c.checkList, checker.NewOnlineDDLChecker(instance.sourceDB.DB, info.sourceID2InterestedDB[i], c.onlineDDL, instance.baList))

dm/pkg/checker/conn_checker.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (c *connNumberChecker) check(ctx context.Context, checkerName string, neede
9494
markCheckError(result, err)
9595
return result
9696
}
97-
err2 := verifyPrivilegesWithResult(result, grants, neededPriv)
97+
err2 := verifyPrivilegesWithResult(result, grants, neededPriv, c.toCheckDB.Version)
9898
if err2 != nil {
9999
// no enough privilege to check the user's connection number
100100
result.State = StateWarning

dm/pkg/checker/privilege.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@ type SourceDumpPrivilegeChecker struct {
5454
checkTables []filter.Table
5555
consistency string
5656
dumpWholeInstance bool
57+
version string
5758
}
5859

5960
// NewSourceDumpPrivilegeChecker returns a RealChecker.
6061
func NewSourceDumpPrivilegeChecker(
6162
db *sql.DB,
6263
dbinfo *dbutil.DBConfig,
64+
version string,
6365
checkTables []filter.Table,
6466
consistency string,
6567
dumpWholeInstance bool,
@@ -70,6 +72,7 @@ func NewSourceDumpPrivilegeChecker(
7072
checkTables: checkTables,
7173
consistency: consistency,
7274
dumpWholeInstance: dumpWholeInstance,
75+
version: version,
7376
}
7477
}
7578

@@ -107,7 +110,7 @@ func (pc *SourceDumpPrivilegeChecker) Check(ctx context.Context) *Result {
107110
dumpRequiredPrivs[mysql.LockTablesPriv] = priv{needGlobal: true}
108111
}
109112

110-
err2 := verifyPrivilegesWithResult(result, grants, dumpRequiredPrivs)
113+
err2 := verifyPrivilegesWithResult(result, grants, dumpRequiredPrivs, pc.version)
111114
if err2 != nil {
112115
result.Errors = append(result.Errors, err2)
113116
result.Instruction = "Please grant the required privileges to the account."
@@ -126,13 +129,14 @@ func (pc *SourceDumpPrivilegeChecker) Name() string {
126129

127130
// SourceReplicatePrivilegeChecker checks replication privileges of source DB.
128131
type SourceReplicatePrivilegeChecker struct {
129-
db *sql.DB
130-
dbinfo *dbutil.DBConfig
132+
db *sql.DB
133+
dbinfo *dbutil.DBConfig
134+
version string
131135
}
132136

133137
// NewSourceReplicationPrivilegeChecker returns a RealChecker.
134-
func NewSourceReplicationPrivilegeChecker(db *sql.DB, dbinfo *dbutil.DBConfig) RealChecker {
135-
return &SourceReplicatePrivilegeChecker{db: db, dbinfo: dbinfo}
138+
func NewSourceReplicationPrivilegeChecker(db *sql.DB, dbinfo *dbutil.DBConfig, version string) RealChecker {
139+
return &SourceReplicatePrivilegeChecker{db: db, dbinfo: dbinfo, version: version}
136140
}
137141

138142
// Check implements the RealChecker interface.
@@ -154,7 +158,7 @@ func (pc *SourceReplicatePrivilegeChecker) Check(ctx context.Context) *Result {
154158
mysql.ReplicationSlavePriv: {needGlobal: true},
155159
mysql.ReplicationClientPriv: {needGlobal: true},
156160
}
157-
err2 := verifyPrivilegesWithResult(result, grants, replRequiredPrivs)
161+
err2 := verifyPrivilegesWithResult(result, grants, replRequiredPrivs, pc.version)
158162
if err2 != nil {
159163
result.Errors = append(result.Errors, err2)
160164
result.State = StateFailure
@@ -169,12 +173,13 @@ func (pc *SourceReplicatePrivilegeChecker) Name() string {
169173
}
170174

171175
type TargetPrivilegeChecker struct {
172-
db *sql.DB
173-
dbinfo *dbutil.DBConfig
176+
db *sql.DB
177+
dbinfo *dbutil.DBConfig
178+
version string
174179
}
175180

176-
func NewTargetPrivilegeChecker(db *sql.DB, dbinfo *dbutil.DBConfig) RealChecker {
177-
return &TargetPrivilegeChecker{db: db, dbinfo: dbinfo}
181+
func NewTargetPrivilegeChecker(db *sql.DB, dbinfo *dbutil.DBConfig, version string) RealChecker {
182+
return &TargetPrivilegeChecker{db: db, dbinfo: dbinfo, version: version}
178183
}
179184

180185
func (t *TargetPrivilegeChecker) Name() string {
@@ -203,7 +208,7 @@ func (t *TargetPrivilegeChecker) Check(ctx context.Context) *Result {
203208
mysql.DropPriv: {needGlobal: true},
204209
mysql.IndexPriv: {needGlobal: true},
205210
}
206-
err2 := verifyPrivilegesWithResult(result, grants, replRequiredPrivs)
211+
err2 := verifyPrivilegesWithResult(result, grants, replRequiredPrivs, t.version)
207212
if err2 != nil {
208213
result.Errors = append(result.Errors, err2)
209214
// because we cannot be very precisely sure about which table
@@ -217,8 +222,9 @@ func verifyPrivilegesWithResult(
217222
result *Result,
218223
grants []string,
219224
requiredPriv map[mysql.PrivilegeType]priv,
225+
version string,
220226
) *Error {
221-
lackedPriv, err := VerifyPrivileges(grants, requiredPriv)
227+
lackedPriv, err := VerifyPrivileges(grants, requiredPriv, version)
222228
if err != nil {
223229
// nolint
224230
return NewError(err.Error())
@@ -284,12 +290,19 @@ func LackedPrivilegesAsStr(lackPriv map[mysql.PrivilegeType]priv) string {
284290
func VerifyPrivileges(
285291
grants []string,
286292
lackPrivs map[mysql.PrivilegeType]priv,
293+
version string,
287294
) (map[mysql.PrivilegeType]priv, error) {
288295
if len(grants) == 0 {
289296
return nil, errors.New("there is no such grant defined for current user on host '%%'")
290297
}
291298

292299
p := parser.New()
300+
301+
// Support for BINLOG MONITOR and other MariaDB things
302+
if strings.Contains(version, "MariaDB") {
303+
p.SetMariaDB(true)
304+
}
305+
293306
for _, grant := range grants {
294307
if len(lackPrivs) == 0 {
295308
break

dm/pkg/conn/basedb.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ type BaseDB struct {
201201
doNotClose bool
202202

203203
// SELECT VERSION()
204-
version string
204+
Version string
205205
}
206206

207207
// NewBaseDB returns *BaseDB object for test.
@@ -213,7 +213,7 @@ func NewBaseDB(db *sql.DB, scope terror.ErrScope, version string, doFuncInClose
213213
Retry: &retry.FiniteRetryStrategy{},
214214
Scope: scope,
215215
doFuncInClose: doFuncInClose,
216-
version: version,
216+
Version: version,
217217
}
218218
}
219219

@@ -385,15 +385,15 @@ func (d *BaseDB) needsModernTerminology() bool {
385385
// - https://mariadb.com/docs/server/reference/sql-statements/administrative-sql-statements/show/show-replica-hosts
386386
//
387387
// Old syntax is still accepted.
388-
if strings.Contains(d.version, "MariaDB") {
388+
if strings.Contains(d.Version, "MariaDB") {
389389
return false
390390
}
391391

392392
// https://dev.mysql.com/doc/relnotes/mysql/8.4/en/news-8-4-0.html#mysqld-8-4-0-deprecation-removal
393393
// MySQL 8.4 removed `SHOW MASTER STATUS`.
394394
minVer := semver.New("8.4.0")
395395

396-
v, err := semver.NewVersion(d.version)
396+
v, err := semver.NewVersion(d.Version)
397397
if err != nil {
398398
return false
399399
}

dm/pkg/conn/basedb_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func TestNeedsModernTerminology(t *testing.T) {
121121
}
122122

123123
for _, tc := range cases {
124-
b.version = tc.version
125-
require.Equal(t, tc.modern, b.needsModernTerminology(), b.version)
124+
b.Version = tc.version
125+
require.Equal(t, tc.modern, b.needsModernTerminology(), b.Version)
126126
}
127127
}

go.mod

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ require (
3939
github.com/go-oauth2/oauth2/v4 v4.5.4
4040
github.com/go-ozzo/ozzo-validation/v4 v4.3.0
4141
github.com/go-sql-driver/mysql v1.7.1
42-
github.com/goccy/go-json v0.10.2
42+
github.com/goccy/go-json v0.10.4
4343
github.com/gogo/gateway v1.1.0
4444
github.com/gogo/protobuf v1.3.2
4545
github.com/golang-jwt/jwt/v5 v5.3.0
@@ -68,15 +68,15 @@ require (
6868
github.com/modern-go/reflect2 v1.0.2
6969
github.com/olekukonko/tablewriter v0.0.5
7070
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
71-
github.com/pierrec/lz4/v4 v4.1.18
71+
github.com/pierrec/lz4/v4 v4.1.21
7272
github.com/pingcap/check v0.0.0-20211026125417-57bd13f7b5f0
7373
github.com/pingcap/errors v0.11.5-0.20250523034308-74f78ae071ee
7474
github.com/pingcap/failpoint v0.0.0-20240528011301-b51a646c7c86
75-
github.com/pingcap/kvproto v0.0.0-20250915095348-efd5134a6d6c
75+
github.com/pingcap/kvproto v0.0.0-20251109100001-1907922fbd18
7676
github.com/pingcap/log v1.1.1-0.20250917021125-19901e015dc9
77-
github.com/pingcap/tidb v1.1.0-beta.0.20250925123346-8ea80e6b2b42
77+
github.com/pingcap/tidb v1.1.0-beta.0.20251122130147-eeee02deea7f
7878
github.com/pingcap/tidb-dashboard v0.0.0-20240326110213-9768844ff5d7
79-
github.com/pingcap/tidb/pkg/parser v0.0.0-20250925154222-93731f04705d
79+
github.com/pingcap/tidb/pkg/parser v0.0.0-20251122130147-eeee02deea7f
8080
github.com/prometheus/client_golang v1.22.0
8181
github.com/prometheus/client_model v0.6.2
8282
github.com/r3labs/diff v1.1.0
@@ -91,7 +91,7 @@ require (
9191
github.com/stretchr/testify v1.10.0
9292
github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954
9393
github.com/thanhpk/randstr v1.0.6
94-
github.com/tikv/client-go/v2 v2.0.8-0.20250917111308-6cbd7e4f9761
94+
github.com/tikv/client-go/v2 v2.0.8-0.20251112113123-1264c1278595
9595
github.com/tikv/pd v1.1.0-beta.0.20240407022249-7179657d129b
9696
github.com/tikv/pd/client v0.0.0-20250703091733-dfd345b89500
9797
github.com/tinylib/msgp v1.1.6
@@ -111,7 +111,7 @@ require (
111111
go.uber.org/mock v0.5.2
112112
go.uber.org/multierr v1.11.0
113113
go.uber.org/ratelimit v0.2.0
114-
go.uber.org/zap v1.27.0
114+
go.uber.org/zap v1.27.1
115115
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
116116
golang.org/x/net v0.42.0
117117
golang.org/x/oauth2 v0.30.0
@@ -120,7 +120,7 @@ require (
120120
golang.org/x/text v0.29.0
121121
golang.org/x/time v0.12.0
122122
google.golang.org/genproto/googleapis/api v0.0.0-20240401170217-c3f982113cda
123-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240515191416-fc5f0ca64291
123+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197
124124
google.golang.org/grpc v1.64.0
125125
google.golang.org/protobuf v1.36.6
126126
gopkg.in/yaml.v2 v2.4.0
@@ -145,8 +145,8 @@ require (
145145
github.com/alibabacloud-go/tea-xml v1.1.3 // indirect
146146
github.com/aliyun/alibabacloud-oss-go-sdk-v2 v1.2.3 // indirect
147147
github.com/aliyun/credentials-go v1.4.7 // indirect
148-
github.com/andybalholm/brotli v1.0.5 // indirect
149-
github.com/apache/arrow/go/v12 v12.0.1 // indirect
148+
github.com/andybalholm/brotli v1.1.1 // indirect
149+
github.com/apache/arrow-go/v18 v18.0.0 // indirect
150150
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
151151
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect
152152
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect
@@ -179,36 +179,37 @@ require (
179179
github.com/go-logr/logr v1.4.1 // indirect
180180
github.com/go-logr/stdr v1.2.2 // indirect
181181
github.com/go-resty/resty/v2 v2.11.0 // indirect
182-
github.com/goccy/go-reflect v1.2.0 // indirect
183182
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
184-
github.com/google/flatbuffers v2.0.8+incompatible // indirect
183+
github.com/google/flatbuffers v24.3.25+incompatible // indirect
185184
github.com/google/gofuzz v1.2.0 // indirect
186185
github.com/google/s2a-go v0.1.7 // indirect
187-
github.com/hamba/avro/v2 v2.22.2-0.20240625062549-66aad10411d9 // indirect
186+
github.com/hamba/avro/v2 v2.27.0 // indirect
188187
github.com/influxdata/tdigest v0.0.1 // indirect
189188
github.com/jellydator/ttlcache/v3 v3.0.1 // indirect
190189
github.com/jfcg/sixb v1.3.8 // indirect
191190
github.com/jfcg/sorty/v2 v2.1.0 // indirect
192191
github.com/joomcode/errorx v1.0.1 // indirect
193192
github.com/klauspost/asmfmt v1.3.2 // indirect
194-
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
193+
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
195194
github.com/ks3sdklib/aws-sdk-go v1.2.9 // indirect
196195
github.com/kylelemons/godebug v1.1.0 // indirect
197196
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect
198197
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect
199198
github.com/mitchellh/mapstructure v1.5.0 // indirect
200199
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
201200
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
201+
github.com/ncruces/go-strftime v0.1.9 // indirect
202202
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
203203
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
204204
github.com/perimeterx/marshmallow v1.1.5 // indirect
205-
github.com/pingcap/metering_sdk v0.0.0-20250918015914-468cd6feb1dc // indirect
205+
github.com/pingcap/metering_sdk v0.0.0-20251110022152-dac449ac5389 // indirect
206206
github.com/qri-io/jsonpointer v0.1.1 // indirect
207207
github.com/qri-io/jsonschema v0.2.1 // indirect
208208
github.com/robfig/cron/v3 v3.0.1 // indirect
209209
github.com/segmentio/asm v1.2.0 // indirect
210210
github.com/segmentio/fasthash v1.0.3 // indirect
211211
github.com/sergi/go-diff v1.3.1 // indirect
212+
github.com/spf13/afero v1.14.0 // indirect
212213
github.com/tidwall/btree v1.7.0 // indirect
213214
github.com/tidwall/buntdb v1.3.0 // indirect
214215
github.com/tidwall/gjson v1.14.4 // indirect
@@ -225,7 +226,7 @@ require (
225226
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 // indirect
226227
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0 // indirect
227228
golang.org/x/arch v0.3.0 // indirect
228-
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
229+
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
229230
google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect
230231
gopkg.in/inf.v0 v0.9.1 // indirect
231232
gopkg.in/ini.v1 v1.67.0 // indirect
@@ -253,7 +254,7 @@ require (
253254
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
254255
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1581 // indirect
255256
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect
256-
github.com/apache/thrift v0.16.0 // indirect
257+
github.com/apache/thrift v0.21.0 // indirect
257258
github.com/ardielle/ardielle-go v1.5.2 // indirect
258259
github.com/aws/aws-sdk-go-v2/service/glue v1.58.1
259260
github.com/beorn7/perks v1.0.1 // indirect
@@ -353,7 +354,7 @@ require (
353354
github.com/pingcap/fn v1.0.0 // indirect
354355
github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 // indirect
355356
github.com/pingcap/sysutil v1.0.1-0.20240311050922-ae81ee01f3a5
356-
github.com/pingcap/tipb v0.0.0-20250829062436-85a019a5df23 // indirect
357+
github.com/pingcap/tipb v0.0.0-20250928030846-9fd33ded6f2c // indirect
357358
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
358359
github.com/pkg/errors v0.9.1 // indirect
359360
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
@@ -392,7 +393,6 @@ require (
392393
github.com/xdg-go/stringprep v1.0.4 // indirect
393394
github.com/xdg/stringprep v1.0.3 // indirect
394395
github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 // indirect
395-
github.com/xitongsys/parquet-go v1.6.3-0.20240520233950-75e935fc3e17 // indirect
396396
github.com/yusufpapurcu/wmi v1.2.4 // indirect
397397
go.etcd.io/bbolt v1.3.10 // indirect
398398
go.etcd.io/etcd/client/v2 v2.305.15 // indirect
@@ -411,10 +411,10 @@ require (
411411
gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect
412412
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
413413
gopkg.in/yaml.v3 v3.0.1 // indirect
414-
modernc.org/libc v1.37.1 // indirect
414+
modernc.org/libc v1.41.0 // indirect
415415
modernc.org/mathutil v1.7.1 // indirect
416416
modernc.org/memory v1.7.2 // indirect
417-
modernc.org/sqlite v1.27.0 // indirect
417+
modernc.org/sqlite v1.29.6 // indirect
418418
sigs.k8s.io/yaml v1.4.0 // indirect
419419
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 // indirect
420420
sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 // indirect
@@ -443,3 +443,10 @@ replace golang.org/x/text => golang.org/x/text v0.28.0
443443

444444
// tls10server=1
445445
godebug tlsrsakex=1
446+
447+
replace github.com/pingcap/tidb/pkg/parser => /home/dvaneeden/dev/pingcap/tidb/pkg/parser
448+
449+
replace github.com/pingcap/tidb => /home/dvaneeden/dev/pingcap/tidb
450+
451+
// copy from TiDB
452+
replace github.com/apache/arrow-go/v18 => github.com/joechenrh/arrow-go/v18 v18.0.0-20250911101656-62c34c9a3b82

0 commit comments

Comments
 (0)