@@ -719,7 +719,7 @@ func checkMagic(rawSql string) (valid bool) {
719719}
720720
721721func (r * Reader ) Name () string {
722- return strings .ToUpper (r .dbtype ) + "_Reader:" + r .database + "_" + Hash (r .rawsqls )
722+ return strings .ToUpper (r .dbtype ) + "_Reader:" + r .rawDatabase + "_" + Hash (r .rawsqls )
723723}
724724
725725func (r * Reader ) setStatsError (err string ) {
@@ -889,7 +889,7 @@ func (r *Reader) run() {
889889}
890890// 开始work逻辑
891891for {
892- if atomic .LoadInt32 (& r .status ) == reader .StatusStopping {
892+ if atomic .LoadInt32 (& r .status ) == reader .StatusStopping || atomic . LoadInt32 ( & r . status ) == reader . StatusStopped {
893893log .Warnf ("Runner[%v] %v stopped from running" , r .meta .RunnerName , r .Name ())
894894return
895895}
@@ -1015,7 +1015,8 @@ func (r *Reader) exec(connectStr string) (err error) {
10151015}
10161016err = r .execReadDB (currentDB , now , recordTablesDone )
10171017if err != nil {
1018- log .Errorf ("Runner[%v] %v exect read db: %v error: %v" , r .meta .RunnerName , currentDB , currentDB , err )
1018+ log .Errorf ("Runner[%v] %v exect read db: %v error: %v,will retry read it" , r .meta .RunnerName , currentDB , currentDB , err )
1019+ return err
10191020}
10201021if atomic .LoadInt32 (& r .status ) == reader .StatusStopping || atomic .LoadInt32 (& r .status ) == reader .StatusStopped {
10211022log .Warnf ("Runner[%v] %v stopped from running" , r .meta .RunnerName , currentDB )
@@ -1049,24 +1050,15 @@ func (r *Reader) execCountDB(curDB string, now time.Time, recordTablesDone Table
10491050if err != nil {
10501051return err
10511052}
1052- db , err := openSql (r .dbtype , connectStr , curDB )
1053- if err != nil {
1054- return err
1055- }
1056- defer func () {
1057- db .Close ()
1058- }()
1059- if err = db .Ping (); err != nil {
1060- return err
1061- }
1053+
10621054log .Infof ("Runner[%v] prepare %v change database success, current database is: %v" , r .meta .RunnerName , r .dbtype , curDB )
10631055
10641056//更新sqls
10651057var tables []string
10661058var sqls string
10671059if r .rawsqls == "" {
10681060// 获取符合条件的数据表,并且将计算表中记录数的query语句赋给 r.rawsqls
1069- tables , sqls , err = r .getDatas (db , curDB , r .rawTable , now , COUNT )
1061+ tables , sqls , err = r .getDatas (connectStr , curDB , r .rawTable , now , COUNT )
10701062if err != nil {
10711063return err
10721064}
@@ -1096,7 +1088,7 @@ func (r *Reader) execCountDB(curDB string, now time.Time, recordTablesDone Table
10961088
10971089// 每张表的记录数
10981090var tableSize int64
1099- tableSize , err = r .execTableCount (db , idx , curDB , rawSql )
1091+ tableSize , err = r .execTableCount (connectStr , idx , curDB , rawSql )
11001092if err != nil {
11011093return err
11021094}
@@ -1118,16 +1110,7 @@ func (r *Reader) execReadDB(curDB string, now time.Time, recordTablesDone TableR
11181110if err != nil {
11191111return err
11201112}
1121- db , err := openSql (r .dbtype , connectStr , r .Name ())
1122- if err != nil {
1123- return err
1124- }
1125- defer func () {
1126- db .Close ()
1127- }()
1128- if err = db .Ping (); err != nil {
1129- return err
1130- }
1113+
11311114log .Infof ("Runner[%v] %v prepare %v change database success" , r .meta .RunnerName , curDB , r .dbtype )
11321115r .database = curDB
11331116
@@ -1136,7 +1119,7 @@ func (r *Reader) execReadDB(curDB string, now time.Time, recordTablesDone TableR
11361119var sqls string
11371120if r .rawsqls == "" {
11381121// 获取符合条件的数据表,并且将获取表中所有记录的语句赋给 r.rawsqls
1139- tables , sqls , err = r .getDatas (db , curDB , r .rawTable , now , TABLE )
1122+ tables , sqls , err = r .getDatas (connectStr , curDB , r .rawTable , now , TABLE )
11401123if err != nil {
11411124log .Errorf ("Runner[%v] %v rawTable: %v get tables and sqls error %v" , r .meta .RunnerName , r .Name (), r .rawTable , r .rawsqls , err )
11421125if len (tables ) == 0 && sqls == "" {
@@ -1181,8 +1164,10 @@ func (r *Reader) execReadDB(curDB string, now time.Time, recordTablesDone TableR
11811164}
11821165}
11831166// 执行每条 sql 语句
1184- exit , isRawSql , readSize = r .execReadSql (db , idx , rawSql , tables )
1185-
1167+ exit , isRawSql , readSize , err = r .execReadSql (connectStr , curDB , idx , rawSql , tables )
1168+ if err != nil {
1169+ return err
1170+ }
11861171if r .rawsqls == "" {
11871172tmpTablesRecords .SetTableInfo (tableName , TableInfo {size : readSize , offset : - 1 })
11881173r .syncRecords .SetTableRecords (curDB , tmpTablesRecords )
@@ -1640,14 +1625,25 @@ type DataQuery struct {
16401625sqls string
16411626}
16421627
1643- func (r * Reader ) getValidData (db * sql. DB , curDB , matchData , matchStr string ,
1628+ func (r * Reader ) getValidData (connectStr , curDB , matchData , matchStr string ,
16441629startIndex , endIndex , timeIndex []int , queryType int ) (validData []string , sqls string , err error ) {
16451630// get all databases and check validate database
16461631query , err := r .getQuery (queryType , curDB )
16471632if err != nil {
16481633return validData , sqls , err
16491634}
16501635
1636+ db , err := openSql (r .dbtype , connectStr , r .Name ())
1637+ if err != nil {
1638+ return nil , "" , err
1639+ }
1640+ defer func () {
1641+ db .Close ()
1642+ }()
1643+ if err = db .Ping (); err != nil {
1644+ return nil , "" , err
1645+ }
1646+
16511647rowsDBs , err := db .Query (query )
16521648if err != nil {
16531649log .Errorf ("Runner[%v] %v prepare %v <%v> query error %v" , r .meta .RunnerName , curDB , r .dbtype , query , err )
@@ -1785,7 +1781,7 @@ func getDefaultSql(database, dbtype string) (defaultSql string, err error) {
17851781
17861782// 根据queryType获取符合要求的数据和需要执行的原始sql语句mr.rawsqls
17871783// queryType 可以为TABLE DATABASE COUNT
1788- func (r * Reader ) getDatas (db * sql. DB , curDB , rawData string , now time.Time , queryType int ) (datas []string , rawsqls string , err error ) {
1784+ func (r * Reader ) getDatas (connectStr , curDB , rawData string , now time.Time , queryType int ) (datas []string , rawsqls string , err error ) {
17891785var startIndex , endIndex , timeIndex []int
17901786var matchData string
17911787
@@ -1796,7 +1792,7 @@ func (r *Reader) getDatas(db *sql.DB, curDB, rawData string, now time.Time, quer
17961792}
17971793if checkAll {
17981794// 导入所有数据
1799- datas , rawsqls , err = r .getAllDatas (db , curDB , queryType )
1795+ datas , rawsqls , err = r .getAllDatas (connectStr , curDB , queryType )
18001796if err != nil {
18011797return datas , rawsqls , err
18021798}
@@ -1819,7 +1815,7 @@ func (r *Reader) getDatas(db *sql.DB, curDB, rawData string, now time.Time, quer
18191815}
18201816
18211817matchStr := getRemainStr (matchData , timeIndex )
1822- datas , rawsqls , err = r .getValidData (db , curDB , matchData , matchStr , startIndex , endIndex , timeIndex , queryType )
1818+ datas , rawsqls , err = r .getValidData (connectStr , curDB , matchData , matchStr , startIndex , endIndex , timeIndex , queryType )
18231819if err != nil {
18241820return datas , rawsqls , err
18251821}
@@ -1875,13 +1871,25 @@ func (r *Reader) getQuery(queryType int, curDB string) (query string, err error)
18751871}
18761872
18771873// 计算每个table的记录条数
1878- func (r * Reader ) execTableCount (db * sql. DB , idx int , curDB , rawSql string ) (tableSize int64 , err error ) {
1874+ func (r * Reader ) execTableCount (connectStr string , idx int , curDB , rawSql string ) (tableSize int64 , err error ) {
18791875execSQL , err := r .getSQL (idx , rawSql )
18801876if err != nil {
18811877log .Errorf ("Runner[%v] get SQL error %v, use raw SQL" , r .meta .RunnerName , err )
18821878execSQL = rawSql
18831879}
18841880log .Infof ("Runner[%v] reader <%v> exec sql <%v>" , r .meta .RunnerName , curDB , execSQL )
1881+
1882+ db , err := openSql (r .dbtype , connectStr , curDB )
1883+ if err != nil {
1884+ return 0 , err
1885+ }
1886+ defer func () {
1887+ db .Close ()
1888+ }()
1889+ if err = db .Ping (); err != nil {
1890+ return 0 , err
1891+ }
1892+
18851893rows , err := db .Query (execSQL )
18861894if err != nil {
18871895log .Errorf ("Runner[%v] %v prepare %v <%v> query error %v" , r .meta .RunnerName , curDB , r .dbtype , execSQL , err )
@@ -1909,7 +1917,7 @@ func (r *Reader) execTableCount(db *sql.DB, idx int, curDB, rawSql string) (tabl
19091917}
19101918
19111919// 执行每条 sql 语句
1912- func (r * Reader ) execReadSql (db * sql. DB , idx int , rawSql string , tables []string ) (exit bool , isRawSql bool , readSize int64 ) {
1920+ func (r * Reader ) execReadSql (connectStr , curDB string , idx int , rawSql string , tables []string ) (exit bool , isRawSql bool , readSize int64 , err error ) {
19131921exit = true
19141922
19151923execSQL , err := r .getSQL (idx , r .syncSQLs [idx ])
@@ -1922,13 +1930,24 @@ func (r *Reader) execReadSql(db *sql.DB, idx int, rawSql string, tables []string
19221930isRawSql = true
19231931}
19241932
1933+ db , err := openSql (r .dbtype , connectStr , curDB )
1934+ if err != nil {
1935+ return exit , isRawSql , 0 , err
1936+ }
1937+ defer func () {
1938+ db .Close ()
1939+ }()
1940+ if err = db .Ping (); err != nil {
1941+ return exit , isRawSql , 0 , err
1942+ }
1943+
19251944log .Infof ("Runner[%v] reader <%v> exec sql <%v>" , r .meta .RunnerName , r .Name (), execSQL )
19261945rows , err := db .Query (execSQL )
19271946if err != nil {
19281947err = fmt .Errorf ("runner[%v] %v prepare %v <%v> query error %v" , r .meta .RunnerName , r .Name (), r .dbtype , execSQL , err )
19291948log .Error (err )
19301949r .sendError (err )
1931- return exit , isRawSql , readSize
1950+ return exit , isRawSql , readSize , err
19321951}
19331952defer rows .Close ()
19341953// Get column names
@@ -1937,7 +1956,7 @@ func (r *Reader) execReadSql(db *sql.DB, idx int, rawSql string, tables []string
19371956err = fmt .Errorf ("runner[%v] %v prepare %v <%v> columns error %v" , r .meta .RunnerName , r .Name (), r .dbtype , execSQL , err )
19381957log .Error (err )
19391958r .sendError (err )
1940- return exit , isRawSql , readSize
1959+ return exit , isRawSql , readSize , err
19411960}
19421961log .Infof ("Runner[%v] SQL :<%v>, schemas: <%v>" , r .meta .RunnerName , execSQL , strings .Join (columns , ", " ))
19431962scanArgs , nochiced := r .getInitScans (len (columns ), rows , r .dbtype )
@@ -2053,7 +2072,7 @@ func (r *Reader) execReadSql(db *sql.DB, idx int, rawSql string, tables []string
20532072}
20542073if atomic .LoadInt32 (& r .status ) == reader .StatusStopping || atomic .LoadInt32 (& r .status ) == reader .StatusStopped {
20552074log .Warnf ("Runner[%v] %v stopped from running" , r .meta .RunnerName , r .Name ())
2056- return exit , isRawSql , readSize
2075+ return exit , isRawSql , readSize , nil
20572076}
20582077r .readChan <- readInfo {data , totalBytes }
20592078r .CurrentCount ++
@@ -2082,12 +2101,12 @@ func (r *Reader) execReadSql(db *sql.DB, idx int, rawSql string, tables []string
20822101}
20832102}
20842103
2085- return exit , isRawSql , readSize
2104+ return exit , isRawSql , readSize , rows . Err ()
20862105}
20872106
2088- func (r * Reader ) getAllDatas (db * sql. DB , curDB string , queryType int ) (datas []string , sqls string , err error ) {
2107+ func (r * Reader ) getAllDatas (connectStr , curDB string , queryType int ) (datas []string , sqls string , err error ) {
20892108// 拿到数据库中所有表及对应的sql语句
2090- datas , sqls , err = r .getValidData (db , curDB , "" , "" , []int {}, []int {}, []int {}, queryType )
2109+ datas , sqls , err = r .getValidData (connectStr , curDB , "" , "" , []int {}, []int {}, []int {}, queryType )
20912110if err != nil {
20922111return datas , sqls , err
20932112}
@@ -2185,7 +2204,7 @@ func (r *Reader) getDBs(connectStr string, now time.Time) ([]string, error) {
21852204if err = db .Ping (); err != nil {
21862205return nil , err
21872206}
2188- dbsAll , _ , err := r .getDatas (db , "" , r .rawDatabase , now , DATABASE )
2207+ dbsAll , _ , err := r .getDatas (connectStr , "" , r .rawDatabase , now , DATABASE )
21892208if err != nil {
21902209return dbsAll , err
21912210}
0 commit comments