Skip to content

Commit cf9b170

Browse files
authored
Exclude system databases during backup (#716)
Signed-off-by: hmsayem <hmsayem@appscode.com>
1 parent d972d8e commit cf9b170

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

pkg/backup.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package pkg
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"path/filepath"
2223

2324
api_v1beta1 "stash.appscode.dev/apimachinery/apis/stash/v1beta1"
@@ -219,6 +220,17 @@ func (opt *mysqlOptions) backupMySQL(targetRef api_v1beta1.TargetRef) (*restic.B
219220
return nil, err
220221
}
221222

223+
databases, err := session.fetchNonSystemDatabases()
224+
if err != nil {
225+
return nil, err
226+
}
227+
228+
if len(databases) == 0 {
229+
return nil, fmt.Errorf("unable to find any databases for backup")
230+
}
231+
232+
session.setTargetDatabases(databases)
233+
222234
session.setUserArgs(opt.myArgs)
223235

224236
// add backup command in the pipeline

pkg/restore.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func (opt *mysqlOptions) restoreMySQL(targetRef api_v1beta1.TargetRef) (*restic.
161161
return nil, err
162162
}
163163

164-
session := opt.newSessionWrapper(MySqlRestoreCMD)
164+
session := opt.newSessionWrapper(MySqlCMD)
165165

166166
err = session.setDatabaseCredentials(opt.kubeClient, appBinding)
167167
if err != nil {

pkg/utils.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const (
4343
MySqlPassword = "password"
4444
MySqlDumpFile = "dumpfile.sql"
4545
MySqlDumpCMD = "mysqldump"
46-
MySqlRestoreCMD = "mysql"
46+
MySqlCMD = "mysql"
4747
EnvMySqlPassword = "MYSQL_PWD"
4848
)
4949

@@ -158,3 +158,39 @@ func (session sessionWrapper) waitForDBReady(waitTimeout int32) error {
158158
return false, nil
159159
})
160160
}
161+
162+
func (session sessionWrapper) fetchNonSystemDatabases() ([]string, error) {
163+
sh := shell.NewSession()
164+
for k, v := range session.sh.Env {
165+
sh.SetEnv(k, v)
166+
}
167+
168+
args := append(session.cmd.Args, "--raw", "--execute", "show databases")
169+
out, err := sh.Command(MySqlCMD, args...).Command("tail", "-n+2").Output()
170+
if err != nil {
171+
return nil, err
172+
}
173+
174+
allDatabases := strings.Split(string(out), "\n")
175+
176+
var databases []string
177+
for _, db := range allDatabases {
178+
db := strings.TrimSpace(db)
179+
if db != "" && !isSystemDatabase(db) {
180+
databases = append(databases, db)
181+
}
182+
}
183+
184+
return databases, nil
185+
}
186+
187+
func isSystemDatabase(db string) bool {
188+
return db == "information_schema" || db == "mysql" || db == "performance_schema" || db == "sys"
189+
}
190+
191+
func (session *sessionWrapper) setTargetDatabases(databases []string) {
192+
session.cmd.Args = append(session.cmd.Args, "--databases")
193+
for _, db := range databases {
194+
session.cmd.Args = append(session.cmd.Args, db)
195+
}
196+
}

0 commit comments

Comments
 (0)