Skip to content

Commit 0655043

Browse files
committed
'restore-schema' and 'restore-data' united to one command
1 parent 493a512 commit 0655043

File tree

3 files changed

+102
-97
lines changed

3 files changed

+102
-97
lines changed

ReadMe.md

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,19 @@ DESCRIPTION:
6262
6363
COMMANDS:
6464
tables Print list of tables
65-
list Print list of backups
66-
delete Delete specific backup
67-
freeze Freeze tables
6865
create Create new backup
6966
upload Upload backup to remote storage
67+
list Print list of backups
7068
download Download backup from remote storage
71-
restore-schema Create databases and tables from backup metadata
72-
restore-data Copy data to 'detached' folder and execute ATTACH
69+
restore Create schema and restore data from backup
70+
delete Delete specific backup
7371
default-config Print default config
72+
freeze Freeze tables
7473
clean Remove data in 'shadow' folder
7574
help, h Shows a list of commands or help for one command
7675
7776
GLOBAL OPTIONS:
78-
--config FILE, -c FILE Config FILE name. (default: "/etc/clickhouse-backup/config.yml")
77+
--config FILE, -c FILE Config FILE name. (default: "/etc/clickhouse-backup/config.yml") [$CLICKHOUSE_BACKUP_CONFIG]
7978
--help, -h show help
8079
--version, -v print the version
8180
```

integration_test.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,8 @@ func testRestoreLegacyBackupFormat(t *testing.T) {
181181
fmt.Println("Download")
182182
r.NoError(dockerExec("clickhouse-backup", "download", "old_format"))
183183

184-
fmt.Println("Restore schema")
185-
r.NoError(dockerExec("clickhouse-backup", "restore-schema", "-t", dbName+".*", "old_format"))
186-
187-
fmt.Println("Restore data")
188-
r.NoError(dockerExec("clickhouse-backup", "restore-data", "-t", dbName+".*", "old_format"))
184+
fmt.Println("Restore")
185+
r.NoError(dockerExec("clickhouse-backup", "restore", "-t", dbName+".*", "old_format"))
189186

190187
fmt.Println("Check data")
191188
for i := range testData {
@@ -257,10 +254,10 @@ func testCommon(t *testing.T) {
257254
r.NoError(dockerExec("clickhouse-backup", "download", "test_backup"))
258255

259256
fmt.Println("Restore schema")
260-
r.NoError(dockerExec("clickhouse-backup", "restore-schema", "test_backup"))
257+
r.NoError(dockerExec("clickhouse-backup", "restore", "--schema", "test_backup"))
261258

262259
fmt.Println("Restore data")
263-
r.NoError(dockerExec("clickhouse-backup", "restore-data", "test_backup"))
260+
r.NoError(dockerExec("clickhouse-backup", "restore", "--data", "test_backup"))
264261

265262
fmt.Println("Check data")
266263
for i := range testData {
@@ -278,11 +275,8 @@ func testCommon(t *testing.T) {
278275
fmt.Println("Download increment")
279276
r.NoError(dockerExec("clickhouse-backup", "download", "increment"))
280277

281-
fmt.Println("Restore schema")
282-
r.NoError(dockerExec("clickhouse-backup", "restore-schema", "increment"))
283-
284-
fmt.Println("Restore data")
285-
r.NoError(dockerExec("clickhouse-backup", "restore-data", "increment"))
278+
fmt.Println("Restore")
279+
r.NoError(dockerExec("clickhouse-backup", "restore", "--schema", "--data", "increment"))
286280

287281
fmt.Println("Check increment data")
288282
for i := range testData {
@@ -359,7 +353,7 @@ func (ch *ClickHouse) checkData(t *testing.T, data TestDataStuct) error {
359353

360354
func dockerExec(cmd ...string) error {
361355
out, err := dockerExecOut(cmd...)
362-
fmt.Println(string(out))
356+
fmt.Print(string(out))
363357
return err
364358
}
365359

@@ -374,7 +368,7 @@ func dockerExecOut(cmd ...string) (string, error) {
374368

375369
func dockerCP(src, dst string) error {
376370
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
377-
dcmd := []string{"cp", src, "clickhouse:"+dst}
371+
dcmd := []string{"cp", src, "clickhouse:" + dst}
378372
out, err := exec.CommandContext(ctx, "docker", dcmd...).CombinedOutput()
379373
fmt.Println(string(out))
380374
cancel()

main.go

Lines changed: 89 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ func main() {
4141

4242
cliapp.Flags = []cli.Flag{
4343
cli.StringFlag{
44-
Name: "config, c",
45-
Value: defaultConfigPath,
46-
Usage: "Config `FILE` name.",
44+
Name: "config, c",
45+
Value: defaultConfigPath,
46+
Usage: "Config `FILE` name.",
4747
EnvVar: "CLICKHOUSE_BACKUP_CONFIG",
4848
},
4949
}
@@ -68,6 +68,35 @@ func main() {
6868
},
6969
Flags: cliapp.Flags,
7070
},
71+
{
72+
Name: "create",
73+
Usage: "Create new backup",
74+
UsageText: "clickhouse-backup create [-t, --tables=<db>.<table>] <backup_name>",
75+
Description: "Create new backup",
76+
Action: func(c *cli.Context) error {
77+
return createBackup(*getConfig(c), c.Args().First(), c.String("t"))
78+
},
79+
Flags: append(cliapp.Flags,
80+
cli.StringFlag{
81+
Name: "table, tables, t",
82+
Hidden: false,
83+
},
84+
),
85+
},
86+
{
87+
Name: "upload",
88+
Usage: "Upload backup to remote storage",
89+
UsageText: "clickhouse-backup upload [--diff-from=<backup_name>] <backup_name>",
90+
Action: func(c *cli.Context) error {
91+
return upload(*getConfig(c), c.Args().First(), c.String("diff-from"))
92+
},
93+
Flags: append(cliapp.Flags,
94+
cli.StringFlag{
95+
Name: "diff-from",
96+
Hidden: false,
97+
},
98+
),
99+
},
71100
{
72101
Name: "list",
73102
Usage: "Print list of backups",
@@ -96,6 +125,39 @@ func main() {
96125
},
97126
Flags: cliapp.Flags,
98127
},
128+
{
129+
Name: "download",
130+
Usage: "Download backup from remote storage",
131+
UsageText: "clickhouse-backup download <backup_name>",
132+
Action: func(c *cli.Context) error {
133+
return download(*getConfig(c), c.Args().First())
134+
},
135+
Flags: cliapp.Flags,
136+
},
137+
{
138+
Name: "restore",
139+
Usage: "Create schema and restore data from backup",
140+
UsageText: "clickhouse-backup restore [--schema] [--data] [-t, --tables=<db>.<table>] <backup_name>",
141+
Action: func(c *cli.Context) error {
142+
return restore(*getConfig(c), c.Args().First(), c.String("t"), c.Bool("s"), c.Bool("d"))
143+
},
144+
Flags: append(cliapp.Flags,
145+
cli.StringFlag{
146+
Name: "table, tables, t",
147+
Hidden: false,
148+
},
149+
cli.BoolFlag{
150+
Name: "schema, s",
151+
Hidden: false,
152+
Usage: "Restore schema only",
153+
},
154+
cli.BoolFlag{
155+
Name: "data, d",
156+
Hidden: false,
157+
Usage: "Restore data only",
158+
},
159+
),
160+
},
99161
{
100162
Name: "delete",
101163
Usage: "Delete specific backup",
@@ -119,6 +181,14 @@ func main() {
119181
},
120182
Flags: cliapp.Flags,
121183
},
184+
{
185+
Name: "default-config",
186+
Usage: "Print default config",
187+
Action: func(*cli.Context) {
188+
PrintDefaultConfig()
189+
},
190+
Flags: cliapp.Flags,
191+
},
122192
{
123193
Name: "freeze",
124194
Usage: "Freeze tables",
@@ -134,80 +204,6 @@ func main() {
134204
},
135205
),
136206
},
137-
{
138-
Name: "create",
139-
Usage: "Create new backup",
140-
UsageText: "clickhouse-backup create [-t, --tables=<db>.<table>] <backup_name>",
141-
Description: "Create new backup",
142-
Action: func(c *cli.Context) error {
143-
return createBackup(*getConfig(c), c.Args().First(), c.String("t"))
144-
},
145-
Flags: append(cliapp.Flags,
146-
cli.StringFlag{
147-
Name: "table, tables, t",
148-
Hidden: false,
149-
},
150-
),
151-
},
152-
{
153-
Name: "upload",
154-
Usage: "Upload backup to remote storage",
155-
UsageText: "clickhouse-backup upload [--diff-from=<backup_name>] <backup_name>",
156-
Action: func(c *cli.Context) error {
157-
return upload(*getConfig(c), c.Args().First(), c.String("diff-from"))
158-
},
159-
Flags: append(cliapp.Flags,
160-
cli.StringFlag{
161-
Name: "diff-from",
162-
Hidden: false,
163-
},
164-
),
165-
},
166-
{
167-
Name: "download",
168-
Usage: "Download backup from remote storage",
169-
UsageText: "clickhouse-backup download <backup_name>",
170-
Action: func(c *cli.Context) error {
171-
return download(*getConfig(c), c.Args().First())
172-
},
173-
Flags: cliapp.Flags,
174-
},
175-
{
176-
Name: "restore-schema",
177-
Usage: "Create databases and tables from backup metadata",
178-
UsageText: "clickhouse-backup restore-schema [-t, --tables=<db>.<table>] <backup_name>",
179-
Action: func(c *cli.Context) error {
180-
return restoreSchema(*getConfig(c), c.Args().First(), c.String("t"))
181-
},
182-
Flags: append(cliapp.Flags,
183-
cli.StringFlag{
184-
Name: "table, tables, t",
185-
Hidden: false,
186-
},
187-
),
188-
},
189-
{
190-
Name: "restore-data",
191-
Usage: "Copy data to 'detached' folder and execute ATTACH",
192-
UsageText: "clickhouse-backup restore-data [-t, --tables=<db>.<table>] <backup_name>",
193-
Action: func(c *cli.Context) error {
194-
return restoreData(*getConfig(c), c.Args().First(), c.String("t"))
195-
},
196-
Flags: append(cliapp.Flags,
197-
cli.StringFlag{
198-
Name: "table, tables, t",
199-
Hidden: false,
200-
},
201-
),
202-
},
203-
{
204-
Name: "default-config",
205-
Usage: "Print default config",
206-
Action: func(*cli.Context) {
207-
PrintDefaultConfig()
208-
},
209-
Flags: cliapp.Flags,
210-
},
211207
{
212208
Name: "clean",
213209
Usage: "Remove data in 'shadow' folder",
@@ -598,6 +594,22 @@ func createBackup(config Config, backupName, tablePattern string) error {
598594
return nil
599595
}
600596

597+
func restore(config Config, backupName string, tablePattern string, schemaOnly bool, dataOnly bool) error {
598+
if schemaOnly || (schemaOnly == dataOnly) {
599+
err := restoreSchema(config, backupName, tablePattern)
600+
if err != nil {
601+
return err
602+
}
603+
}
604+
if dataOnly || (schemaOnly == dataOnly) {
605+
err := restoreData(config, backupName, tablePattern)
606+
if err != nil {
607+
return err
608+
}
609+
}
610+
return nil
611+
}
612+
601613
func restoreData(config Config, backupName string, tablePattern string) error {
602614
if backupName == "" {
603615
fmt.Println("Select backup for restore:")

0 commit comments

Comments
 (0)