Documentation ¶
Index ¶
- Constants
- Variables
- func AnalyzeInternalTableName(tableName string) (isInternalTable bool, hint string, uuid string, t time.Time, err error)
- func CreateOnlineDDLUUID() (string, error)
- func CreateUUID() (string, error)
- func CreateUUIDWithDelimiter(delimiter string) (string, error)
- func GenerateGCTableName(state TableGCState, t time.Time) (tableName string, err error)
- func GenerateInternalTableName(hint string, uuid string, t time.Time) (tableName string, err error)
- func GenerateRenameStatement(fromTableName string, state TableGCState, t time.Time) (statement string, toTableName string, err error)
- func GenerateRenameStatementOldFormat(fromTableName string, state TableGCState, t time.Time) (statement string, toTableName string, err error)
- func GenerateRenameStatementWithUUID(fromTableName string, state TableGCState, uuid string, t time.Time) (statement string, toTableName string, err error)
- func IsGCTableName(tableName string) bool
- func IsInternalOperationTableName(tableName string) bool
- func IsOnlineDDLTableName(tableName string) bool
- func IsOnlineDDLUUID(uuid string) bool
- func OnlineDDLToGCUUID(uuid string) string
- func ParseAlterTableOptions(alterStatement string) (explicitSchema, explicitTable, alterOptions string)
- func ParseEnumOrSetTokensMap(enumOrSetValues string) map[int]string
- func ParseEnumValues(enumColumnType string) string
- func ParseGCLifecycle(gcLifecycle string) (states map[TableGCState]bool, err error)
- func ParseOnlineDDLStatement(sql string, parser *sqlparser.Parser) (ddlStmt sqlparser.DDLStatement, action sqlparser.DDLAction, err error)
- func ParseSetValues(setColumnType string) string
- func ReadableTimestamp() string
- func ToReadableTimestamp(t time.Time) string
- func ValidateMigrationContext(migrationContext string) error
- type DDLStrategy
- type DDLStrategySetting
- func (cached *DDLStrategySetting) CachedSize(alloc bool) int64
- func (setting *DDLStrategySetting) CutOverThreshold() (d time.Duration, err error)
- func (setting *DDLStrategySetting) ForceCutOverAfter() (d time.Duration, err error)
- func (setting *DDLStrategySetting) IsAllowConcurrent() bool
- func (setting *DDLStrategySetting) IsAllowForeignKeysFlag() bool
- func (setting *DDLStrategySetting) IsAllowZeroInDateFlag() bool
- func (setting *DDLStrategySetting) IsAnalyzeTableFlag() bool
- func (setting *DDLStrategySetting) IsDeclarative() bool
- func (setting *DDLStrategySetting) IsInOrderCompletion() bool
- func (setting *DDLStrategySetting) IsPostponeCompletion() bool
- func (setting *DDLStrategySetting) IsPostponeLaunch() bool
- func (setting *DDLStrategySetting) IsPreferInstantDDL() bool
- func (setting *DDLStrategySetting) IsSingleton() bool
- func (setting *DDLStrategySetting) IsSingletonContext() bool
- func (setting *DDLStrategySetting) IsVreplicationTestSuite() bool
- func (setting *DDLStrategySetting) RetainArtifactsDuration() (d time.Duration, err error)
- func (setting *DDLStrategySetting) RuntimeOptions() []string
- func (setting *DDLStrategySetting) ToString() string
- type InternalTableHint
- type NormalizedDDLQuery
- type OnlineDDL
- func NewOnlineDDL(keyspace string, table string, sql string, ...) (onlineDDL *OnlineDDL, err error)
- func NewOnlineDDLs(keyspace string, sql string, ddlStmt sqlparser.DDLStatement, ...) (onlineDDLs []*OnlineDDL, err error)
- func OnlineDDLFromCommentedStatement(stmt sqlparser.Statement) (onlineDDL *OnlineDDL, err error)
- func (onlineDDL *OnlineDDL) GetAction(parser *sqlparser.Parser) (action sqlparser.DDLAction, err error)
- func (onlineDDL *OnlineDDL) GetActionStr(parser *sqlparser.Parser) (action sqlparser.DDLAction, actionStr string, err error)
- func (onlineDDL *OnlineDDL) GetGCUUID() string
- func (onlineDDL *OnlineDDL) GetRevertUUID(parser *sqlparser.Parser) (uuid string, err error)
- func (onlineDDL *OnlineDDL) IsView(parser *sqlparser.Parser) bool
- func (onlineDDL *OnlineDDL) StrategySetting() *DDLStrategySetting
- func (onlineDDL *OnlineDDL) ToJSON() ([]byte, error)
- func (onlineDDL *OnlineDDL) ToString() string
- type OnlineDDLStatus
- type TableGCState
Constants ¶
const ( SchemaMigrationsTableName = "schema_migrations" RevertActionStr = "revert" )
const ( OldGCTableNameExpression string = `^_vt_(HOLD|PURGE|EVAC|DROP)_([0-f]{32})_([0-9]{14})$` // GCTableNameExpression parses new internal table name format, e.g. _vt_hld_6ace8bcef73211ea87e9f875a4d24e90_20200915120410_ GCTableNameExpression string = `^_vt_(hld|prg|evc|drp)_([0-f]{32})_([0-9]{14})_$` )
const (
InternalTableNameExpression string = `^_vt_([a-zA-Z0-9]{3})_([0-f]{32})_([0-9]{14})_$`
)
Variables ¶
var ( // ErrDirectDDLDisabled is returned when direct DDL is disabled, and a user attempts to run a DDL statement ErrDirectDDLDisabled = errors.New("direct DDL is disabled") // ErrOnlineDDLDisabled is returned when online DDL is disabled, and a user attempts to run an online DDL operation (submit, review, control) ErrOnlineDDLDisabled = errors.New("online DDL is disabled") // ErrForeignKeyFound indicates any finding of FOREIGN KEY clause in a DDL statement ErrForeignKeyFound = errors.New("Foreign key found") // ErrRenameTableFound indicates finding of ALTER TABLE...RENAME in ddl statement ErrRenameTableFound = errors.New("RENAME clause found") )
Functions ¶
func AnalyzeInternalTableName ¶ added in v0.19.0
func AnalyzeInternalTableName(tableName string) (isInternalTable bool, hint string, uuid string, t time.Time, err error)
AnalyzeInternalTableName analyzes a table name, and assumign it's a vitess internal table name, extracts the hint, uuid and time out of the name. An internal table name can be e.g. `_vt_hld_6ace8bcef73211ea87e9f875a4d24e90_20200915120410_`, analyzed like so: - hint is `hld` - UUID is `6ace8bcef73211ea87e9f875a4d24e90` - Time is 2020-09-15 12:04:10
func CreateOnlineDDLUUID ¶ added in v0.11.0
CreateOnlineDDLUUID creates a UUID in OnlineDDL format, e.g.: a0638f6b_ec7b_11ea_9bf8_000d3a9b8a9a
func CreateUUID ¶
CreateUUID creates a globally unique ID example result "1876a01a-354d-11eb-9a79-f8e4e33000bb"
func CreateUUIDWithDelimiter ¶ added in v0.14.0
CreateUUIDWithDelimiter creates a globally unique ID, with a given delimiter example results: - 1876a01a-354d-11eb-9a79-f8e4e33000bb (delimiter = "-") - 7cee19dd_354b_11eb_82cd_f875a4d24e90 (delimiter = "_") - 55d00cdce6ab11eabfe60242ac1c000d (delimiter = "")
func GenerateGCTableName ¶ added in v0.10.0
func GenerateGCTableName(state TableGCState, t time.Time) (tableName string, err error)
GenerateGCTableName creates a GC table name, based on desired state and time, and with random UUID
func GenerateInternalTableName ¶ added in v0.20.0
generateGCTableName creates an internal table name, based on desired hint and time, and with optional preset UUID. If uuid is given, then it must be in condensed-UUID format. If empty, the function auto-generates a UUID.
func GenerateRenameStatement ¶
func GenerateRenameStatement(fromTableName string, state TableGCState, t time.Time) (statement string, toTableName string, err error)
GenerateRenameStatement generates a "RENAME TABLE" statement, where a table is renamed to a GC table.
func GenerateRenameStatementOldFormat ¶ added in v0.20.0
func GenerateRenameStatementOldFormat(fromTableName string, state TableGCState, t time.Time) (statement string, toTableName string, err error)
GenerateRenameStatement generates a "RENAME TABLE" statement, where a table is renamed to a GC table.
func GenerateRenameStatementWithUUID ¶ added in v0.9.0
func GenerateRenameStatementWithUUID(fromTableName string, state TableGCState, uuid string, t time.Time) (statement string, toTableName string, err error)
GenerateRenameStatementWithUUID generates a "RENAME TABLE" statement, where a table is renamed to a GC table, with preset UUID
func IsGCTableName ¶
IsGCTableName answers 'true' when the given table name stands for a GC table
func IsInternalOperationTableName ¶ added in v0.9.0
IsInternalOperationTableName answers 'true' when the given table name stands for an internal Vitess table used for operations such as: - Online DDL (gh-ost, pt-online-schema-change) - Table GC (renamed before drop) Apps such as VStreamer may choose to ignore such tables.
func IsOnlineDDLTableName ¶ added in v0.9.0
IsOnlineDDLTableName answers 'true' when the given table name _appears to be_ a name generated by an online DDL operation; either the name determined by the online DDL Executor, or by pt-online-schema-change. There is no guarantee that the tables _was indeed_ generated by an online DDL flow.
func IsOnlineDDLUUID ¶
IsOnlineDDLUUID answers 'true' when the given string is an online-ddl UUID, e.g.: a0638f6b_ec7b_11ea_9bf8_000d3a9b8a9a
func OnlineDDLToGCUUID ¶ added in v0.9.0
OnlineDDLToGCUUID converts a UUID in online-ddl format to GC-table format
func ParseAlterTableOptions ¶
func ParseAlterTableOptions(alterStatement string) (explicitSchema, explicitTable, alterOptions string)
ParseAlterTableOptions parses a ALTER ... TABLE... statement into: - explicit schema and table, if available - alter options (anything that follows ALTER ... TABLE)
func ParseEnumOrSetTokensMap ¶ added in v0.13.0
ParseEnumOrSetTokensMap parses the comma delimited part of an enum column definition and returns a map where [1] is the first token, and [<n>] is the last.
func ParseEnumValues ¶ added in v0.11.0
ParseEnumValues parses the comma delimited part of an enum column definition
func ParseGCLifecycle ¶
func ParseGCLifecycle(gcLifecycle string) (states map[TableGCState]bool, err error)
ParseGCLifecycle parses a comma separated list of gc states and returns a map of indicated states
func ParseOnlineDDLStatement ¶ added in v0.9.0
func ParseOnlineDDLStatement(sql string, parser *sqlparser.Parser) (ddlStmt sqlparser.DDLStatement, action sqlparser.DDLAction, err error)
ParseOnlineDDLStatement parses the given SQL into a statement and returns the action type of the DDL statement, or error if the statement is not a DDL
func ParseSetValues ¶ added in v0.13.0
ParseSetValues parses the comma delimited part of a set column definition
func ReadableTimestamp ¶ added in v0.20.0
func ReadableTimestamp() string
ReadableTimestamp returns the current timestamp, in seconds resolution, that is human readable
func ToReadableTimestamp ¶
ToReadableTimestamp returns a timestamp, in seconds resolution, that is human readable (as opposed to unix timestamp which is just a number) Example: for Aug 25 2020, 16:04:25 we return "20200825160425"
func ValidateMigrationContext ¶ added in v0.18.0
ValidateMigrationContext validates that the given migration context only uses valid characters
Types ¶
type DDLStrategy ¶ added in v0.9.0
type DDLStrategy string
DDLStrategy suggests how an ALTER TABLE should run (e.g. "direct", "online", "gh-ost" or "pt-osc")
const ( // DDLStrategyDirect means not an online-ddl migration; unmanaged. Just a normal MySQL `ALTER TABLE` DDLStrategyDirect DDLStrategy = "direct" // DDLStrategyVitess requests vreplication to run the migration; new name for DDLStrategyOnline DDLStrategyVitess DDLStrategy = "vitess" // DDLStrategyOnline requests vreplication to run the migration DDLStrategyOnline DDLStrategy = "online" // DDLStrategyGhost requests gh-ost to run the migration DDLStrategyGhost DDLStrategy = "gh-ost" // DDLStrategyPTOSC requests pt-online-schema-change to run the migration DDLStrategyPTOSC DDLStrategy = "pt-osc" // DDLStrategyMySQL is a managed migration (queued and executed by the scheduler) but runs through a MySQL `ALTER TABLE` DDLStrategyMySQL DDLStrategy = "mysql" )
func (DDLStrategy) IsDirect ¶ added in v0.9.0
func (s DDLStrategy) IsDirect() bool
IsDirect returns true if this strategy is a direct strategy A strategy is direct if it's not explciitly one of the online DDL strategies
type DDLStrategySetting ¶ added in v0.11.0
type DDLStrategySetting struct { Strategy DDLStrategy `json:"strategy,omitempty"` Options string `json:"options,omitempty"` }
DDLStrategySetting is a formal breakdown of the @@ddl_strategy variable, into strategy and options
func NewDDLStrategySetting ¶ added in v0.11.0
func NewDDLStrategySetting(strategy DDLStrategy, options string) *DDLStrategySetting
NewDDLStrategySetting instantiates a new setting
func ParseDDLStrategy ¶ added in v0.9.0
func ParseDDLStrategy(strategyVariable string) (*DDLStrategySetting, error)
ParseDDLStrategy parses and validates the value of @@ddl_strategy or -ddl_strategy variables
func (*DDLStrategySetting) CachedSize ¶ added in v0.11.0
func (cached *DDLStrategySetting) CachedSize(alloc bool) int64
func (*DDLStrategySetting) CutOverThreshold ¶ added in v0.17.0
func (setting *DDLStrategySetting) CutOverThreshold() (d time.Duration, err error)
CutOverThreshold returns a the duration threshold indicated by --cut-over-threshold
func (*DDLStrategySetting) ForceCutOverAfter ¶ added in v0.19.0
func (setting *DDLStrategySetting) ForceCutOverAfter() (d time.Duration, err error)
ForceCutOverAfter returns a the duration threshold indicated by --force-cut-over-after
func (*DDLStrategySetting) IsAllowConcurrent ¶ added in v0.13.0
func (setting *DDLStrategySetting) IsAllowConcurrent() bool
IsAllowConcurrent checks if strategy options include --allow-concurrent
func (*DDLStrategySetting) IsAllowForeignKeysFlag ¶ added in v0.16.0
func (setting *DDLStrategySetting) IsAllowForeignKeysFlag() bool
IsAllowForeignKeysFlag checks if strategy options include --unsafe-allow-foreign-keys
func (*DDLStrategySetting) IsAllowZeroInDateFlag ¶ added in v0.13.0
func (setting *DDLStrategySetting) IsAllowZeroInDateFlag() bool
IsAllowZeroInDateFlag checks if strategy options include --allow-zero-in-date
func (*DDLStrategySetting) IsAnalyzeTableFlag ¶ added in v0.18.0
func (setting *DDLStrategySetting) IsAnalyzeTableFlag() bool
IsAnalyzeTableFlag checks if strategy options include --analyze-table
func (*DDLStrategySetting) IsDeclarative ¶ added in v0.11.0
func (setting *DDLStrategySetting) IsDeclarative() bool
IsDeclarative checks if strategy options include --declarative
func (*DDLStrategySetting) IsInOrderCompletion ¶ added in v0.16.0
func (setting *DDLStrategySetting) IsInOrderCompletion() bool
IsInOrderCompletion checks if strategy options include --in-order-completion
func (*DDLStrategySetting) IsPostponeCompletion ¶ added in v0.13.0
func (setting *DDLStrategySetting) IsPostponeCompletion() bool
IsPostponeCompletion checks if strategy options include --postpone-completion
func (*DDLStrategySetting) IsPostponeLaunch ¶ added in v0.15.0
func (setting *DDLStrategySetting) IsPostponeLaunch() bool
IsPostponeLaunch checks if strategy options include --postpone-launch
func (*DDLStrategySetting) IsPreferInstantDDL ¶ added in v0.16.0
func (setting *DDLStrategySetting) IsPreferInstantDDL() bool
IsPreferInstantDDL checks if strategy options include --prefer-instant-ddl
func (*DDLStrategySetting) IsSingleton ¶ added in v0.11.0
func (setting *DDLStrategySetting) IsSingleton() bool
IsSingleton checks if strategy options include --singleton
func (*DDLStrategySetting) IsSingletonContext ¶ added in v0.11.0
func (setting *DDLStrategySetting) IsSingletonContext() bool
IsSingletonContext checks if strategy options include --singleton-context
func (*DDLStrategySetting) IsVreplicationTestSuite ¶ added in v0.11.0
func (setting *DDLStrategySetting) IsVreplicationTestSuite() bool
IsVreplicationTestSuite checks if strategy options include --vreplicatoin-test-suite
func (*DDLStrategySetting) RetainArtifactsDuration ¶ added in v0.15.5
func (setting *DDLStrategySetting) RetainArtifactsDuration() (d time.Duration, err error)
RetainArtifactsDuration returns a the duration indicated by --retain-artifacts
func (*DDLStrategySetting) RuntimeOptions ¶ added in v0.11.0
func (setting *DDLStrategySetting) RuntimeOptions() []string
RuntimeOptions returns the options used as runtime flags for given strategy, removing any internal hint options
func (*DDLStrategySetting) ToString ¶ added in v0.11.0
func (setting *DDLStrategySetting) ToString() string
ToString returns a simple string representation of this instance
type InternalTableHint ¶ added in v0.20.0
type InternalTableHint string
const ( InternalTableUnknownHint InternalTableHint = "nil" InternalTableGCHoldHint InternalTableHint = "hld" InternalTableGCPurgeHint InternalTableHint = "prg" InternalTableGCEvacHint InternalTableHint = "evc" InternalTableGCDropHint InternalTableHint = "drp" InternalTableVreplicationHint InternalTableHint = "vrp" )
func (InternalTableHint) String ¶ added in v0.20.0
func (h InternalTableHint) String() string
type NormalizedDDLQuery ¶ added in v0.9.0
NormalizedDDLQuery contains a query which is online-ddl -normalized
type OnlineDDL ¶
type OnlineDDL struct { Keyspace string `json:"keyspace,omitempty"` Table string `json:"table,omitempty"` Schema string `json:"schema,omitempty"` SQL string `json:"sql,omitempty"` UUID string `json:"uuid,omitempty"` Strategy DDLStrategy `json:"strategy,omitempty"` Options string `json:"options,omitempty"` // Stateful fields: MigrationContext string `json:"context,omitempty"` Status OnlineDDLStatus `json:"status,omitempty"` TabletAlias string `json:"tablet,omitempty"` Retries int64 `json:"retries,omitempty"` ReadyToComplete int64 `json:"ready_to_complete,omitempty"` WasReadyToComplete int64 `json:"was_ready_to_complete,omitempty"` }
OnlineDDL encapsulates the relevant information in an online schema change request
func NewOnlineDDL ¶
func NewOnlineDDL(keyspace string, table string, sql string, ddlStrategySetting *DDLStrategySetting, migrationContext string, providedUUID string, parser *sqlparser.Parser) (onlineDDL *OnlineDDL, err error)
NewOnlineDDL creates a schema change request with self generated UUID and RequestTime
func NewOnlineDDLs ¶ added in v0.11.0
func NewOnlineDDLs(keyspace string, sql string, ddlStmt sqlparser.DDLStatement, ddlStrategySetting *DDLStrategySetting, migrationContext string, providedUUID string, parser *sqlparser.Parser) (onlineDDLs []*OnlineDDL, err error)
NewOnlineDDLs takes a single DDL statement, normalizes it (potentially break down into multiple statements), and generates one or more OnlineDDL instances, one for each normalized statement
func OnlineDDLFromCommentedStatement ¶ added in v0.11.0
OnlineDDLFromCommentedStatement creates a schema instance based on a commented query. The query is expected to be commented as e.g. `CREATE /*vt+ uuid=... context=... table=... strategy=... options=... */ TABLE ...`
func (*OnlineDDL) GetAction ¶ added in v0.9.0
func (onlineDDL *OnlineDDL) GetAction(parser *sqlparser.Parser) (action sqlparser.DDLAction, err error)
GetAction extracts the DDL action type from the online DDL statement
func (*OnlineDDL) GetActionStr ¶ added in v0.9.0
func (onlineDDL *OnlineDDL) GetActionStr(parser *sqlparser.Parser) (action sqlparser.DDLAction, actionStr string, err error)
GetActionStr returns a string representation of the DDL action
func (*OnlineDDL) GetRevertUUID ¶ added in v0.10.0
GetRevertUUID works when this migration is a revert for another migration. It returns the UUID fo the reverted migration. The function returns error when this is not a revert migration.
func (*OnlineDDL) StrategySetting ¶ added in v0.11.0
func (onlineDDL *OnlineDDL) StrategySetting() *DDLStrategySetting
StrategySetting returns the ddl strategy setting associated with this online DDL
type OnlineDDLStatus ¶
type OnlineDDLStatus string
OnlineDDLStatus is an indicator to a online DDL status
const ( OnlineDDLStatusRequested OnlineDDLStatus = "requested" OnlineDDLStatusCancelled OnlineDDLStatus = "cancelled" OnlineDDLStatusQueued OnlineDDLStatus = "queued" OnlineDDLStatusReady OnlineDDLStatus = "ready" OnlineDDLStatusRunning OnlineDDLStatus = "running" OnlineDDLStatusComplete OnlineDDLStatus = "complete" OnlineDDLStatusFailed OnlineDDLStatus = "failed" )
type TableGCState ¶
type TableGCState string
TableGCState provides a state for the type of GC table: HOLD? PURGE? EVAC? DROP? See details below
const ( // HoldTableGCState is the state where table was just renamed away. Data is still in tact, // and the user has the option to rename it back. A "safety" period. HoldTableGCState TableGCState = "HOLD" // PurgeTableGCState is the state where we purge table data. Table in this state is "lost" to the user. // if in this state, the table will be fully purged. PurgeTableGCState TableGCState = "PURGE" // EvacTableGCState is a waiting state, where we merely wait out the table's pages to be // gone from InnoDB's buffer pool, adaptive hash index cache, and whatnot. EvacTableGCState TableGCState = "EVAC" // DropTableGCState is the state where the table is to be dropped. Probably ASAP DropTableGCState TableGCState = "DROP" // TableDroppedGCState is a pseudo state; a hint that the table does not exists anymore TableDroppedGCState TableGCState = "" )
func AnalyzeGCTableName ¶
func AnalyzeGCTableName(tableName string) (isGCTable bool, state TableGCState, uuid string, t time.Time, err error)
AnalyzeGCTableName analyzes a given table name to see if it's a GC table, and if so, parse out its state, uuid, and timestamp
func (TableGCState) TableHint ¶ added in v0.20.0
func (s TableGCState) TableHint() InternalTableHint