如何把mariadb迁移到mysql
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何把mariadb迁移到mysql相关的知识,希望对你有一定的参考价值。
背景客户环境数据库目前使用的是 MariaDB 10.1.9,计划迁移到 MySQL 5.7.25,需要测试迁移是否能成功,以及迁移到 MySQL 后数据库的性能对比。
一、准备环境
安装 MariaDB 10.1.9
2. 安装 mysql 5.7.25
二、迁移测试
对 MariaDB 全备
2. 导入全备到 MySQL 5.7.25
可以看到在导入全备时有个报错,从字面看,是 mysql.proc 这张表损坏了。
接下来我们分析下,这个报错到底是什么
四、性能测试结果
从 sysbench 压测的结果来看,在相同配置的服务器以及保持重要参数一致的情况下(比如双一打开),MariaDB 10.1.9 与 MySQL 5.7.25 读写性能相差不大。
五、总结
经测试,MariaDB 10.1.9 可以正常迁移到 MySQL 5.7.25,并能保证迁移后性能不下降或者略有上升。
参考技术A 迁移步骤:1、停止正在运行的Mysql服务
# systemctl stop mysqld
2、安装mariadb及升级工具等
# pacman -S mariadb libmariadbclient mariadb-clients
3、重启Mysql服务
# systemctl start mysqld
4、对已存在的库进行升级
# mysql_upgrade -p本回答被提问者采纳
无法通过 Laravel 迁移使用 mysql/mariaDB 功能
【中文标题】无法通过 Laravel 迁移使用 mysql/mariaDB 功能【英文标题】:Unable to mysql/mariaDB function through Laravel migrations 【发布时间】:2021-06-21 03:32:10 【问题描述】:我正在尝试创建一个mysql存储函数
DROP FUNCTION IF EXISTS getDistance;
DELIMITER $$
CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE distance varchar(255);
SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
if(distance is null) then
return null;
else
return distance;
end if;
END
$$
DELIMITER ;
如果我通过 phpMyAdmin 执行该函数,则工作正常,并且在数据库中创建函数
但是当我尝试运行 Laravel(v6.x) 迁移来创建存储函数时,我遇到了错误
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateStoredFunction extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
DB::unprepared('
DROP FUNCTION IF EXISTS getDistance;
DELIMITER $$
CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE distance varchar(255);
SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
if(distance is null) then
return null;
else
return distance;
end if;
END
$$
DELIMITER ;
');
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
DB::unprepared('DROP FUNCTION IF EXISTS getDistance');
错误
Doctrine\DBAL\Driver\PDO\Exception::("SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MariaDB 服务器版本相对应的手册以获取正确的'DELIMITER $$ 附近使用的语法 创建函数
getDistance
(lat1
VARCHAR(255), ' 在第 1 行")
【问题讨论】:
附注:down
尝试删除名为 distance
的函数,但您的函数名为 getDistance
。
双贴:***.com/questions/66780770/…删除两者之一
@brombeer,已删除 2 个中的 1 个,谢谢
【参考方案1】:
DELIMITER
不是有效的 SQL 语句。这只是一个 MySql 客户端命令。所以不要使用它。您得到的错误准确地告诉了您。
你可以像这样在 Laravel 中创建一个存储过程,这将使 DELIMITER
过时
试试这个
class CreateStoredFunction extends Migration
/**
* Run the migrations.
*
* @return void
*/
public function up()
DB::unprepared('
DROP FUNCTION IF EXISTS getDistance;
CREATE FUNCTION `getDistance`(`lat1` VARCHAR(255), `lng1` VARCHAR(255), `lat2` VARCHAR(255), `lng2` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
DECLARE distance varchar(255);
SELECT (6371 * acos(cos(radians(lat2)) * cos(radians(lat1)) * cos(radians(lng1) - radians(lng2)) + sin(radians(lat2)) * sin(radians(lat1)))) INTO distance;
if(distance is null) then
return null;
else
return distance;
end if;
END
');
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
DB::unprepared('DROP FUNCTION IF EXISTS getDistance');
【讨论】:
一个好的答案应该包括对更改的内容以及它如何解决问题的解释,以便 OP 和任何未来的读者可以从中学习。 if / else 构造也没有任何意义。你可以很容易地做到return distance;
以上是关于如何把mariadb迁移到mysql的主要内容,如果未能解决你的问题,请参考以下文章