MySQL5.7 如何通過邏輯備份遷移到GreatSQL及注意事項(xiàng)
一、背景概述
在將數(shù)據(jù)庫從MySQL 5.7遷移到GreatSQL8.0.32時(shí),由于數(shù)據(jù)量較小且關(guān)注安全性,決定使用mysqldump執(zhí)行邏輯備份,并將數(shù)據(jù)導(dǎo)入GreatSQL。但在備份時(shí)采用了備份全庫(--all-databases)的方式,在導(dǎo)入GreatSQL后,修改用戶密碼時(shí)出現(xiàn)錯(cuò)誤。這是因?yàn)閙ysqldump備份時(shí)包括了mysql系統(tǒng)庫,而MySQL 5.7中的mysql系統(tǒng)庫采用了MyISAM存儲引擎,而GreatSQL的mysql系統(tǒng)庫采用了InnoDB存儲引擎。因此,在導(dǎo)入數(shù)據(jù)后,部分系統(tǒng)表被覆蓋,導(dǎo)致了錯(cuò)誤的出現(xiàn)。
二、問題復(fù)現(xiàn)
1.部署2個(gè)實(shí)例
部署MySQL 5.7與GreatSQL 8.0.32,具體步驟省略
2.MySQL 創(chuàng)建測試數(shù)據(jù)
通過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)建測試用戶
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)行全庫備份
$ /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)入過程中有如下報(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庫下的系統(tǒng)表被修改成了MyISAM存儲引擎,并且修改用戶密碼會涉及多張系統(tǒng)表的更新,在一個(gè) SQL 語句中既對非事務(wù)表進(jìn)行了更新操作,又對事務(wù)表進(jìn)行了更新操作,這違反了 GTID 的一致性規(guī)則。
7.GreatSQL執(zhí)行查看庫表信息的操作
當(dāng)執(zhí)行刷新權(quán)限的操作后,執(zhí)行下面的SQL時(shí)也會報(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ù)庫的系統(tǒng)用戶,用來管理和訪問系統(tǒng)自帶實(shí)例information_schema;導(dǎo)入MySQL系統(tǒng)庫后,user表被覆蓋為MySQL5.7的user表,此用戶不存在,因此在刷新權(quá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` ( ......
???????三、問題解決
1、可以初始化一個(gè)新的GreatSQL實(shí)例,備份這個(gè)新的GreatSQL實(shí)例的MySQL系統(tǒng)庫
$ /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)庫的備份文件到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)建用戶測試
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 通過邏輯備份遷移時(shí),不要備份系統(tǒng)庫mysql,避免發(fā)生問題;
2.用戶及權(quán)限可以單獨(dú)進(jìn)行備份然后導(dǎo)入到GreatSQL或者M(jìn)ySQL8.0中。
關(guān)于 GreatSQL
GreatSQL是適用于金融級應(yīng)用的國內(nèi)自主開源數(shù)據(jù)庫,具備高性能、高可靠、高易用性、高安全等多個(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 通過邏輯備份遷移到GreatSQL注意事項(xiàng)的文章就介紹到這了,更多相關(guān)MySQL5.7邏輯備份遷移到GreatSQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql?InnoDB聚簇索引二級索引聯(lián)合索引特點(diǎn)
這篇文章主要為大家介紹了Mysql?InnoDB聚簇索引二級索引聯(lián)合索引特點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05MySQL 數(shù)據(jù)庫兩臺主機(jī)同步實(shí)戰(zhàn)(linux)
MySQL支持單向、異步復(fù)制,復(fù)制過程中一個(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)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03MySQL中varchar類型的字段默認(rèn)值設(shè)置方式
這篇文章主要介紹了MySQL中varchar類型的字段默認(rèn)值設(shè)置方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10mysql數(shù)據(jù)庫批量復(fù)制單條數(shù)據(jù)記錄
在開發(fā)數(shù)據(jù)庫應(yīng)用時(shí),批量操作是一項(xiàng)常見的需求,無論是數(shù)據(jù)遷移、備份還是更新,理解如何在MySQL中批量復(fù)制單條數(shù)據(jù)都至關(guān)重要,本文將深入探討這一過程,并提供代碼示例,幫助你更好地理解這一概念2025-02-02