-
Notifications
You must be signed in to change notification settings - Fork 380
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Query information_schema compatible with MySQL 8 #2652
Conversation
Turn off statistics caching for MySQL 8. To always retrieve the latest statistics directly from the storage engine and bypass cached values, set information_schema_stats_expiry to 0. See https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_information_schema_stats_expiry
Hi px3303, many thanks for the PR! To help understanding the context for it, would you mind updating the description with a bit of background on why this change is necessary/what [potential] problem it fixes? Thanks in advance. |
Ah, that's great - thank you! |
/gcbrun |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just a few minor nits and a couple of questions on the code itself inline.
quota/mysqlqm/mysql_quota.go
Outdated
return nil | ||
} | ||
|
||
return fmt.Errorf("Failed to get variable %q: %v", opt, err) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: "Failed" -> "failed"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok
quota/mysqlqm/mysql_quota.go
Outdated
exp, err := strconv.Atoi(expiry) | ||
if err != nil || exp != 0 { | ||
if _, err := db.ExecContext(ctx, "SET SESSION "+opt+"=0"); err != nil { | ||
return fmt.Errorf("Failed to set variable %q: %v", opt, err) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: "Failed" -> "failed"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok
quota/mysqlqm/mysql_quota.go
Outdated
opt := "information_schema_stats_expiry" | ||
res := db.QueryRowContext(ctx, "SHOW VARIABLES LIKE '%"+opt+"%'") | ||
var none, expiry string | ||
err := res.Scan(&none, &expiry) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Can you inline this with the check on err
like this: if err := res.Scan...; err != nil { ...
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok
quota/mysqlqm/mysql_quota.go
Outdated
return fmt.Errorf("Failed to get variable %q: %v", opt, err) | ||
} | ||
|
||
exp, err := strconv.Atoi(expiry) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can inline here too?
if exp, err := strconv...; err != nil || exp != 0 { ...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed
// turnOffInformationSchemaCache turn off statistics caching for MySQL 8 | ||
// To always retrieve the latest statistics directly from the storage engine and bypass cached values, set information_schema_stats_expiry to 0. | ||
// See https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_information_schema_stats_expiry | ||
func turnOffInformationSchemaCache(ctx context.Context, db *sql.DB) error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will this fail safely for all versions of MySQL prior to 8 or should we check the version and only execute on version 8+?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it will fail safely for versions before MySQL 8.0. This is because this function uses SHOW VARIABLES LIKE
statement. Executing this statement in versions before MySQL 8 is equivalent to searching a system variable that does not exist, and it will only return empty result rather than error.
Furthermore, tests of 5.6.51, 5.7.36 and 8.0.27 have already passed locally.
quota/mysqlqm/mysql_quota.go
Outdated
opt := "information_schema_stats_expiry" | ||
res := db.QueryRowContext(ctx, "SHOW VARIABLES LIKE '%"+opt+"%'") | ||
var none, expiry string | ||
err := res.Scan(&none, &expiry) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible to Scan
expiry directly into an int
or will that fail if it's unset?
(Would changing the query to SELECT FROM @@SESSION.information_schema_stats_expiry
help if so?)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks very much for your reminding. Indeed, “expiry” should be scanned into int
type.
When this variable does not exist (versions before MySQL 8.0), SELECT @@SESSION.information_schema_stats_expiry
statement will return error instead of empty resultset.
Standardize error messages and code style. More rigorous SQL statements.
I have updated the |
/gcbrun |
@px3303 - Nice one, many thanks! |
Turn off statistics caching for MySQL 8.
To always retrieve the latest statistics directly from the storage engine and bypass cached values, set information_schema_stats_expiry to 0.
See https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_information_schema_stats_expiry
Fixes #2653
Checklist