diff --git a/README.md b/README.md index ff5cb98..e5a7af5 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Exporting your database to a separate Google Cloud Storage bucket, preferrably i ```bash $ cloudsql-exporter --help -usage: cloudsql-backup --bucket=BUCKET --project=PROJECT [<flags>] +usage: cloudsql-exporter --bucket=BUCKET --project=PROJECT [<flags>] Export Cloud SQL databases to Google Cloud Storage @@ -31,6 +31,7 @@ Flags: --ensure-iam-bindings Ensure that the Cloud SQL service account has the required IAM role binding to export and validate the backup + --fileType Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV) [Default SQL] ``` ## Installation diff --git a/main.go b/main.go index cc750f1..ceb43b7 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "log" "os" "time" + "strings" "golang.org/x/oauth2/google" "google.golang.org/api/option" @@ -17,13 +18,14 @@ import ( ) var ( - app = kingpin.New("cloudsql-backup", "Export Cloud SQL databases to Google Cloud Storage") + app = kingpin.New("cloudsql-exporter", "Export Cloud SQL databases to Google Cloud Storage") bucket = app.Flag("bucket", "Google Cloud Storage bucket name").Required().String() project = app.Flag("project", "GCP project ID").Required().String() instance = app.Flag("instance", "Cloud SQL instance name, if not specified all within the project will be enumerated").String() compression = app.Flag("compression", "Enable compression for exported SQL files").Bool() ensureIamBindings = app.Flag("ensure-iam-bindings", "Ensure that the Cloud SQL service account has the required IAM role binding to export and validate the backup").Bool() + fileType = app.Flag("fileType", "Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV) [Default SQL]").Default("SQL").String() ) func main() { @@ -71,15 +73,13 @@ func main() { } } - var objectName string + var objectName string = time.Now().Format(time.RFC3339Nano) + "." + strings.ToLower(*fileType) if *compression { - objectName = time.Now().Format(time.RFC3339Nano) + ".sql.gz" - } else { - objectName = time.Now().Format(time.RFC3339Nano) + ".sql" + objectName = objectName + ".gz" } - err := cloudsql.ExportCloudSQLDatabase(ctx, sqlAdminSvc, databases, *project, string(instance), *bucket, objectName) + err := cloudsql.ExportCloudSQLDatabase(ctx, sqlAdminSvc, databases, *project, string(instance), *bucket, objectName, strings.ToUpper(*fileType)) if err != nil { log.Fatal(err) } diff --git a/pkg/cloudsql/cloudsql.go b/pkg/cloudsql/cloudsql.go index 19538d5..cbd2370 100644 --- a/pkg/cloudsql/cloudsql.go +++ b/pkg/cloudsql/cloudsql.go @@ -117,13 +117,13 @@ func ListDatabasesForCloudSQLInstance(ctx context.Context, sqlAdminSvc *sqladmin } // ExportCloudSQLDatabase exports a Cloud SQL database to a Google Cloud Storage bucket. -func ExportCloudSQLDatabase(ctx context.Context, sqlAdminSvc *sqladmin.Service, databases []string, projectID, instanceID, bucketName, objectName string) error { +func ExportCloudSQLDatabase(ctx context.Context, sqlAdminSvc *sqladmin.Service, databases []string, projectID, instanceID, bucketName, objectName string, fileType string) error { for _, database := range databases { log.Printf("Exporting database %s for instance %s", database, instanceID) req := &sqladmin.InstancesExportRequest{ ExportContext: &sqladmin.ExportContext{ - FileType: "SQL", + FileType: fileType, Kind: "sql#exportContext", Databases: []string{database}, Uri: fmt.Sprintf("gs://%s/%s/%s/%s/%s", bucketName, projectID, instanceID, database, objectName),