schema

package
v0.11.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 27, 2021 License: Apache-2.0 Imports: 16 Imported by: 0

Documentation

Index

Constants

View Source
const (
	SchemaMigrationsTableName = "schema_migrations"
	RevertActionStr           = "revert"
)

Variables

View Source
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 CreateOnlineDDLUUID added in v0.11.0

func CreateOnlineDDLUUID() (string, error)

CreateOnlineDDLUUID creates a UUID in OnlineDDL format, e.g.: a0638f6b_ec7b_11ea_9bf8_000d3a9b8a9a

func CreateUUID

func CreateUUID() (string, error)

CreateUUID creates a globally unique ID example result "1876a01a-354d-11eb-9a79-f8e4e33000bb"

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 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 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

func IsGCTableName(tableName string) bool

IsGCTableName answers 'true' when the given table name stands for a GC table

func IsGCUUID added in v0.9.0

func IsGCUUID(uuid string) bool

IsGCUUID answers 'true' when the given string is an GC UUID, e.g.: a0638f6bec7b11ea9bf8000d3a9b8a9a

func IsInternalOperationTableName added in v0.9.0

func IsInternalOperationTableName(tableName string) bool

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

func IsOnlineDDLTableName(tableName string) bool

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

func IsOnlineDDLUUID(uuid string) bool

IsOnlineDDLUUID answers 'true' when the given string is an online-ddl UUID, e.g.: a0638f6b_ec7b_11ea_9bf8_000d3a9b8a9a

func MigrationBasePath

func MigrationBasePath() string

MigrationBasePath is the root for all schema migration entries

func MigrationJobsKeyspacePath

func MigrationJobsKeyspacePath(keyspace string) string

MigrationJobsKeyspacePath is the base path for a tablet job, by keyspace

func MigrationJobsKeyspaceShardPath

func MigrationJobsKeyspaceShardPath(keyspace, shard string) string

MigrationJobsKeyspaceShardPath is the base path for a tablet job, by keyspace and shard

func MigrationQueuedPath

func MigrationQueuedPath() string

MigrationQueuedPath is the base path for schema migrations that have been reviewed and queued for execution. Kept for historical reference

func MigrationRequestsPath

func MigrationRequestsPath() string

MigrationRequestsPath is the base path for all newly received schema migration requests. such requests need to be investigates/reviewed, and to be assigned to all shards

func OnlineDDLToGCUUID added in v0.9.0

func OnlineDDLToGCUUID(uuid string) string

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 ParseEnumTokens added in v0.11.0

func ParseEnumTokens(enumValues string) []string

ParseEnumTokens parses the comma delimited part of an enum column definition and returns the (unquoted) text values

func ParseEnumTokensMap added in v0.11.0

func ParseEnumTokensMap(enumValues string) map[string]string

ParseEnumTokensMap parses the comma delimited part of an enum column definition and returns a map where ["1"] is the first token, and ["<n>"] is th elast token

func ParseEnumValues added in v0.11.0

func ParseEnumValues(enumColumnType string) string

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) (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 ReplaceTableNameInCreateTableStatement added in v0.10.0

func ReplaceTableNameInCreateTableStatement(createStatement string, replacementName string) (modifiedStatement string, err error)

ReplaceTableNameInCreateTableStatement returns a modified CREATE TABLE statement, such that the table name is replaced with given name. This intentionally string-replacement based, and not sqlparser.String() based, because the return statement has to be formatted _precisely_, up to MySQL version nuances, like the original statement. That's in favor of tengo table comparison. We expect a well formatted, no-qualifier statement in the form: CREATE TABLE `some_table` ...

func ToReadableTimestamp

func ToReadableTimestamp(t time.Time) string

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"

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. Just a normal MySQL ALTER TABLE
	DDLStrategyDirect DDLStrategy = "direct"
	// 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"
)

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) IsDeclarative added in v0.11.0

func (setting *DDLStrategySetting) IsDeclarative() bool

IsDeclarative checks if strategy options include -declarative

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) IsSkipTopo added in v0.11.0

func (setting *DDLStrategySetting) IsSkipTopo() bool

IsSkipTopo suggests that DDL should apply to tables bypassing global topo request

func (*DDLStrategySetting) IsVreplicationTestSuite added in v0.11.0

func (setting *DDLStrategySetting) IsVreplicationTestSuite() bool

IsVreplicationTestSuite checks if strategy options include -vreplicatoin-test-suite

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 NormalizedDDLQuery added in v0.9.0

type NormalizedDDLQuery struct {
	SQL       string
	TableName sqlparser.TableName
}

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"`
	RequestTime    int64           `json:"time_created,omitempty"`
	RequestContext string          `json:"context,omitempty"`
	Status         OnlineDDLStatus `json:"status,omitempty"`
	TabletAlias    string          `json:"tablet,omitempty"`
	Retries        int64           `json:"retries,omitempty"`
}

OnlineDDL encapsulates the relevant information in an online schema change request

func FromJSON

func FromJSON(bytes []byte) (*OnlineDDL, error)

FromJSON creates an OnlineDDL from json

func NewOnlineDDL

func NewOnlineDDL(keyspace string, table string, sql string, ddlStrategySetting *DDLStrategySetting, requestContext string) (*OnlineDDL, 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, requestContext string) (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

func OnlineDDLFromCommentedStatement(stmt sqlparser.Statement) (onlineDDL *OnlineDDL, err error)

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 ReadTopo

func ReadTopo(ctx context.Context, conn topo.Conn, entryPath string) (*OnlineDDL, error)

ReadTopo reads a OnlineDDL object from given topo connection

func (*OnlineDDL) GetAction added in v0.9.0

func (onlineDDL *OnlineDDL) GetAction() (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() (action sqlparser.DDLAction, actionStr string, err error)

GetActionStr returns a string representation of the DDL action

func (*OnlineDDL) GetGCUUID added in v0.9.0

func (onlineDDL *OnlineDDL) GetGCUUID() string

GetGCUUID gets this OnlineDDL UUID in GC UUID format

func (*OnlineDDL) GetRevertUUID added in v0.10.0

func (onlineDDL *OnlineDDL) GetRevertUUID() (uuid string, err error)

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) JobsKeyspaceShardPath

func (onlineDDL *OnlineDDL) JobsKeyspaceShardPath(shard string) string

JobsKeyspaceShardPath returns job/<keyspace>/<shard>/<uuid>

func (*OnlineDDL) RequestTimeSeconds

func (onlineDDL *OnlineDDL) RequestTimeSeconds() int64

RequestTimeSeconds converts request time to seconds (losing nano precision)

func (*OnlineDDL) StrategySetting added in v0.11.0

func (onlineDDL *OnlineDDL) StrategySetting() *DDLStrategySetting

StrategySetting returns the ddl strategy setting associated with this online DDL

func (*OnlineDDL) ToJSON

func (onlineDDL *OnlineDDL) ToJSON() ([]byte, error)

ToJSON exports this onlineDDL to JSON

func (*OnlineDDL) ToString

func (onlineDDL *OnlineDDL) ToString() string

ToString returns a simple string representation of this instance

func (*OnlineDDL) WriteTopo

func (onlineDDL *OnlineDDL) WriteTopo(ctx context.Context, conn topo.Conn, basePath string) error

WriteTopo writes this online DDL to given topo connection, based on basePath and and this DDL's UUID

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"
)

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

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL