MySQL5.7 如何通過(guò)邏輯備份遷移到GreatSQL及注意事項(xiàng)
一、背景概述
在將數(shù)據(jù)庫(kù)從MySQL 5.7遷移到GreatSQL8.0.32時(shí),由于數(shù)據(jù)量較小且關(guān)注安全性,決定使用mysqldump執(zhí)行邏輯備份,并將數(shù)據(jù)導(dǎo)入GreatSQL。但在備份時(shí)采用了備份全庫(kù)(--all-databases)的方式,在導(dǎo)入GreatSQL后,修改用戶密碼時(shí)出現(xiàn)錯(cuò)誤。這是因?yàn)閙ysqldump備份時(shí)包括了mysql系統(tǒng)庫(kù),而MySQL 5.7中的mysql系統(tǒng)庫(kù)采用了MyISAM存儲(chǔ)引擎,而GreatSQL的mysql系統(tǒng)庫(kù)采用了InnoDB存儲(chǔ)引擎。因此,在導(dǎo)入數(shù)據(jù)后,部分系統(tǒng)表被覆蓋,導(dǎo)致了錯(cuò)誤的出現(xiàn)。
二、問(wèn)題復(fù)現(xiàn)
1.部署2個(gè)實(shí)例
部署MySQL 5.7與GreatSQL 8.0.32,具體步驟省略
2.MySQL 創(chuàng)建測(cè)試數(shù)據(jù)
通過(guò)sysbench創(chuàng)建10張表
$ sysbench lua/oltp_read_write.lua --mysql-db=sysbench --mysql-host=192.168.1.162 --mysql-port=6003 --mysql-user=root --mysql-password=greatsql --tables=10 --table_size=5000 --report-interval=2 --threads=10 --time=600 --mysql-ignore-errors=all prepare
3.MySQL 創(chuàng)建測(cè)試用戶
mysql> create user test1@'%' identified by 'greatsql'; Query OK, 0 rows affected (0.01 sec) mysql> grant all on *.* to test1@'%'; Query OK, 0 rows affected (0.01 sec)
???????4.MySQL進(jìn)行全庫(kù)備份
$ /mysql57/svr/mysql/bin/mysqldump -uroot -pgreatsql -h192.168.1.162 -P6003 --single-transaction --set-gtid-purged=OFF --all-databases > all.sql
5.GreatSQL導(dǎo)入備份數(shù)據(jù)
greatsql> source all.sql;
在導(dǎo)入過(guò)程中有如下報(bào)錯(cuò),從這里可以看出導(dǎo)入時(shí)有系統(tǒng)表被導(dǎo)入,并且部分系統(tǒng)表不支持被修改:
6.GreatSQL執(zhí)行修改用戶密碼操作
greatsql> alter user test1@'%' identified by 'abc123'; ERROR 1785 (HY000): Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
此時(shí)報(bào)錯(cuò)違反了 GTID 的一致性,由于導(dǎo)入數(shù)據(jù)后有部分MySQL庫(kù)下的系統(tǒng)表被修改成了MyISAM存儲(chǔ)引擎,并且修改用戶密碼會(huì)涉及多張系統(tǒng)表的更新,在一個(gè) SQL 語(yǔ)句中既對(duì)非事務(wù)表進(jìn)行了更新操作,又對(duì)事務(wù)表進(jìn)行了更新操作,這違反了 GTID 的一致性規(guī)則。
7.GreatSQL執(zhí)行查看庫(kù)表信息的操作
當(dāng)執(zhí)行刷新權(quán)限的操作后,執(zhí)行下面的SQL時(shí)也會(huì)報(bào)錯(cuò)
greatsql> flush privileges; Query OK, 0 rows affected, 11 warnings (0.00 sec) greatsql> show tables; ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist greatsql> show databases; ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
mysql.infoschema
用戶是MySQL8.0中引入的,mysql.infoschema
用戶是MySQL數(shù)據(jù)庫(kù)的系統(tǒng)用戶,用來(lái)管理和訪問(wèn)系統(tǒng)自帶實(shí)例information_schema;導(dǎo)入MySQL系統(tǒng)庫(kù)后,user表被覆蓋為MySQL5.7的user表,此用戶不存在,因此在刷新權(quán)限后訪問(wèn)元數(shù)據(jù)信息時(shí)報(bào)錯(cuò);
8.查看mysqldump備份了哪些系統(tǒng)表
$ grep 'CREATE TABLE ' all.sql ...... CREATE TABLE `innodb_index_stats` ( CREATE TABLE `innodb_table_stats` ( CREATE TABLE `ndb_binlog_index` ( CREATE TABLE `plugin` ( CREATE TABLE `proc` ( CREATE TABLE `procs_priv` ( CREATE TABLE `proxies_priv` ( CREATE TABLE `server_cost` ( CREATE TABLE `servers` ( CREATE TABLE IF NOT EXISTS `slave_master_info` ( CREATE TABLE IF NOT EXISTS `slave_relay_log_info` ( CREATE TABLE `slave_worker_info` ( CREATE TABLE `tables_priv` ( CREATE TABLE `time_zone` ( CREATE TABLE `time_zone_leap_second` ( CREATE TABLE `time_zone_name` ( CREATE TABLE `time_zone_transition` ( CREATE TABLE `time_zone_transition_type` ( CREATE TABLE `user` ( CREATE TABLE IF NOT EXISTS `general_log` ( CREATE TABLE IF NOT EXISTS `slow_log` ( ......
???????三、問(wèn)題解決
1、可以初始化一個(gè)新的GreatSQL實(shí)例,備份這個(gè)新的GreatSQL實(shí)例的MySQL系統(tǒng)庫(kù)
$ /greatsql/svr/mysql/bin/mysqldump -uroot -pgreatdb -h127.0.0.1 -P6001 --single-transaction --set-gtid-purged=OFF -B mysql > mysql.sql
???????2、導(dǎo)入mysql系統(tǒng)庫(kù)的備份文件到GreatSQL實(shí)例中
greatsql> source mysql.sql;
3、導(dǎo)入完成后,刷新權(quán)限
greatsql> flush privileges; Query OK, 0 rows affected (0.01 sec)
4.執(zhí)行創(chuàng)建用戶測(cè)試
greatsql> create user test1@'%' identified by 'greatsql'; Query OK, 0 rows affected (0.01 sec) greatsql> grant all on *.* to test1@'%'; Query OK, 0 rows affected (0.01 sec)
5.執(zhí)行 show 操作
greatsql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | sys_audit | | sysbench | | test | +--------------------+ 7 rows in set (0.01 sec) greatsql> show tables; +----------------+ | Tables_in_test | +----------------+ | test | +----------------+ 1 row in set (0.01 sec)
???????四、總結(jié)
1.在從MySQL5.7向GreatSQL或者M(jìn)ySQL8.0 通過(guò)邏輯備份遷移時(shí),不要備份系統(tǒng)庫(kù)mysql,避免發(fā)生問(wèn)題;
2.用戶及權(quán)限可以單獨(dú)進(jìn)行備份然后導(dǎo)入到GreatSQL或者M(jìn)ySQL8.0中。
關(guān)于 GreatSQL
GreatSQL是適用于金融級(jí)應(yīng)用的國(guó)內(nèi)自主開源數(shù)據(jù)庫(kù),具備高性能、高可靠、高易用性、高安全等多個(gè)核心特性,可以作為MySQL或Percona Server的可選替換,用于線上生產(chǎn)環(huán)境,且完全免費(fèi)并兼容MySQL或Percona Server。
相關(guān)鏈接: GreatSQL社區(qū)GiteeGitHubBilibili
GreatSQL社區(qū):
社區(qū)博客有獎(jiǎng)?wù)鞲逶斍椋?a rel="external nofollow" target="_blank">https://greatsql.cn/thread-100-1-1.html
到此這篇關(guān)于MySQL5.7 通過(guò)邏輯備份遷移到GreatSQL注意事項(xiàng)的文章就介紹到這了,更多相關(guān)MySQL5.7邏輯備份遷移到GreatSQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql?InnoDB聚簇索引二級(jí)索引聯(lián)合索引特點(diǎn)
這篇文章主要為大家介紹了Mysql?InnoDB聚簇索引二級(jí)索引聯(lián)合索引特點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05MySQL 數(shù)據(jù)庫(kù)兩臺(tái)主機(jī)同步實(shí)戰(zhàn)(linux)
MySQL支持單向、異步復(fù)制,復(fù)制過(guò)程中一個(gè)服務(wù)器充當(dāng)主服務(wù)器,而一個(gè)或多個(gè)其它服務(wù)器充當(dāng)從服務(wù)器。主服務(wù)器將更新寫入二進(jìn)制日志文件,并維護(hù)日志文件的一個(gè)索引以跟蹤日志循環(huán)。2009-04-04MySQL DATE_SUB()函數(shù)的實(shí)現(xiàn)示例
本文主要介紹了MySQL DATE_SUB() 函數(shù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03MySQL中varchar類型的字段默認(rèn)值設(shè)置方式
這篇文章主要介紹了MySQL中varchar類型的字段默認(rèn)值設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10mysql數(shù)據(jù)庫(kù)批量復(fù)制單條數(shù)據(jù)記錄
在開發(fā)數(shù)據(jù)庫(kù)應(yīng)用時(shí),批量操作是一項(xiàng)常見的需求,無(wú)論是數(shù)據(jù)遷移、備份還是更新,理解如何在MySQL中批量復(fù)制單條數(shù)據(jù)都至關(guān)重要,本文將深入探討這一過(guò)程,并提供代碼示例,幫助你更好地理解這一概念2025-02-02