mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 02:35:49 +08:00

* feat: support tool for mysql master-slave sync * feat: support mysql master-master sync * feat: improve log * feat: improve code * fix: fix bug when len(res) ==0 * fix: fix bug when len(res) ==0 * feat: support master-slave sync * feat: add deleteSlaveUser for TestStopMasterSlaveSync * feat: add deleteSlaveUser for TestStopMasterSlaveSync
90 lines
3.0 KiB
Go
90 lines
3.0 KiB
Go
// Copyright 2023 The Casdoor Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package sync_v2
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
)
|
|
|
|
func deleteSlaveUser(masterdb *Database) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
}()
|
|
masterdb.exec("delete from mysql.user where user = '%v'", masterdb.slaveUser)
|
|
masterdb.exec("flush privileges")
|
|
}
|
|
|
|
func createSlaveUser(masterdb *Database) {
|
|
res := make([]map[string]string, 0)
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
}()
|
|
res = masterdb.exec("show databases")
|
|
dbNames := make([]string, 0, len(res))
|
|
for _, dbInfo := range res {
|
|
dbName := dbInfo["Database"]
|
|
dbNames = append(dbNames, dbName)
|
|
}
|
|
log.Println("dbs in mysql: ", dbNames)
|
|
res = masterdb.exec("show tables")
|
|
tableNames := make([]string, 0, len(res))
|
|
for _, table := range res {
|
|
tableName := table[fmt.Sprintf("Tables_in_%v", masterdb.database)]
|
|
tableNames = append(tableNames, tableName)
|
|
}
|
|
log.Printf("tables in %v: %v", masterdb.database, tableNames)
|
|
|
|
// delete user to prevent user already exists
|
|
res = masterdb.exec("delete from mysql.user where user = '%v'", masterdb.slaveUser)
|
|
res = masterdb.exec("flush privileges")
|
|
|
|
// create replication user
|
|
res = masterdb.exec("create user '%s'@'%s' identified by '%s'", masterdb.slaveUser, "%", masterdb.slavePassword)
|
|
res = masterdb.exec("select host, user from mysql.user where user = '%v'", masterdb.slaveUser)
|
|
log.Println("user: ", res[0])
|
|
res = masterdb.exec("grant replication slave on *.* to '%s'@'%s'", masterdb.slaveUser, "%")
|
|
res = masterdb.exec("flush privileges")
|
|
res = masterdb.exec("show grants for '%s'@'%s'", masterdb.slaveUser, "%")
|
|
log.Println("grants: ", res[0])
|
|
|
|
// check env
|
|
res = masterdb.exec("show variables like 'server_id'")
|
|
log.Println("server_id: ", res[0]["Value"])
|
|
res = masterdb.exec("show variables like 'log_bin'")
|
|
log.Println("log_bin: ", res[0]["Value"])
|
|
res = masterdb.exec("show variables like 'binlog_format'")
|
|
log.Println("binlog_format: ", res[0]["Value"])
|
|
res = masterdb.exec("show variables like 'binlog_row_image'")
|
|
}
|
|
|
|
func masterStatus(masterdb *Database) {
|
|
res := masterdb.exec("show master status")
|
|
if len(res) == 0 {
|
|
log.Printf("no master status for master [%v:%v]\n", masterdb.host, masterdb.port)
|
|
return
|
|
}
|
|
pos := res[0]["Position"]
|
|
file := res[0]["File"]
|
|
log.Println("*****check master status*****")
|
|
log.Println("master:", masterdb.host, ":", masterdb.port)
|
|
log.Println("file:", file, ", position:", pos, ", master status:", res)
|
|
log.Println("*****************************")
|
|
}
|