博客/工程

如何迁移配置数据库

2020年1月13日6分钟

Grafana默认使用sqlite3作为本地数据库来保存配置信息(比如用户、仪表板、警报等)。但你知道吗您还可以使用其他数据库为了这个目的?

许多大客户更喜欢使用Postgresql或MySQL/MariaDB,最近我们收到了一个公司的请求,希望帮助他们将配置数据从Postgresql迁移到MySQL。这不是一个常见的请求,所以我们没有任何预先存在的工具来完成它。

如果你发现自己处于这种情况,这里有一个方法可以让它变得非常简单。Grafana对数据库没有过于复杂的要求——这就是为什么它可以使用sqlite3——所以这主要是一个将数据库记录从Postgres数据库中的每个表转移到MySQL/MariaDB数据库的问题。

为了简单起见,本演练将做一些假设:源数据库和目标数据库都不受密码或其他安全性的保护。两者都运行在与Grafana服务器相同的服务器上。所有命令都以root身份运行。

在生产中,这些情况都不太可能发生,因此您需要根据需要调整命令。所有对MySQL的引用同样适用于MariaDB。

一步一步的指示

首先,确保在更改数据库时不要更改正在运行的Grafana的版本。我们将使用Grafana创建新的(空的)数据库,然后将旧数据库中的数据恢复到其中。

1.让我们停止Grafana,并创建空的MySQL数据库。

[root@al-g1 ~]# systemctl stop grafana-server [root@al-g1 ~]# mysql命令以;或\ g。....MariaDB [(none)]>创建数据库grafana查询OK, 1 row affected (0.00 sec) MariaDB [(none)]> ^D [root@al-g1 ~]#

2.接下来,我们要编辑grafana.ini文件连接到这个新数据库,并重新启动grafana。确保数据库ini的部分具有连接到该数据库的相关部分。下面是这个简化的例子:

[database] type = mysql host = localhost:3306 name = grafana user = [mysql数据库用户名]password = [mysql数据库密码]

记得注释掉所有引用postgres数据库的行。

3.现在,启动Grafana并检查是否可以以admin/admin身份登录,然后停止它。

[root@al-g1 ~]# systemctl start grafana-server [root@al-g1 ~]# systemctl #check您可以登录到grafana。[root@al-g1 ~]# systemctl stop grafana-server

4.接下来,我们想要连接到postgres数据库并列出我们想要导出的表。

[root@al-g1 ~]# sudo -u postgres psql -d grafana cannot change directory to "/root" psql(9.2.24)输入"help"请求帮助。grafana=# SELECT table_name FROM information_schemaTABLE WHERE table_type='BASE TABLE' AND table_schema='public';Migration_log user temp_user star org org_user dashboard_tag dashboard dashboard_provisioning data_source api_key dashboard_snapshot quota plugin_setting session playlist playlist_item preferences alert_rule_tag alert alert_notification_state alert_notification annotation dashboard_version annotation_tag test_data team dashboard_acl team_member tag login_attempt cache_data user_auth server_lock user_auth_token data_source_acl team_group report(38行)grafana=# \q

5.将这些表名保存在您最喜欢的文本编辑器中。

6.现在我们将使用postgres备份命令转储这些表,并使用SED对输出执行一些后处理。下面是第一个表Alert的简单示例。这需要针对上面的38个表中的每一个进行操作。(在本文末尾有一个针对所有38个表运行的完整示例。)

[root@al-g1 ~]# pg_dump -U postgres -a——inserts——disable-dollar- quote——no-tablespaces——no-security-labels -h localhost -w -t alert grafana | sed -r -e '/^SET/d' -e '/^SELECT pg_catalog/d' -e 's/——Data for Name: ([a-zA-Z0-9_]+)。*/TRUNCATE \1;/' -e 's/"user"/user/g' -e 's/INSERT INTO public。/INSERT INTO /' -e 's/\\\ \"/\\\\\"/g' |less . /

这六个sed命令值得更详细地解释,以防您因数据中的特定情况而遇到问题。

' / ^设置/ d '' / ^选择pg_catalog / d '删除一些特定于postgres的SET语句和SELECT语句。

's/——名称的数据:([a-zA-Z0-9_]+)。* /截断\ 1;/ '将打印在每组INSERT语句前面的头更改为TRUNCATE [table-name]语句。这确保了可能在新表中的任何数据(来自Grafana第一次对它运行时的数据)都被丢弃。

的“用户”/用户/ g’删除表名“user”周围的引号,这是postgres要求而mysql不要求的。如果您的查询中有字符串“user”,这可能会让您出错。你可能需要把它加回去。

的/插入到公共。/ insert into /'新版本的Postgres在导出的每个表名上都添加了模式。这样就去掉了它们。

的 /\\\"/\\\\\"/ g’这确保了任何转义引号都是双重转义的,因为这需要通过MySQL导入,以便转义引号能够通过MySQL。

7.接下来,我们希望能够将数据读入MySQL。如果您正在运行相同的系统,您可以只使用管道-| mysql grafana-在上述命令的末尾,。但更可能的情况是您在不同的系统上,因此将输出重定向到一个文件-> grafana.psql-并复制该文件到目标系统,在那里您可以导入它的[root@al-g1 ~]# mysql grafana < grafana.psql '。

脚本运行导出对所有表一次

要同时对所有表运行相同的导出,可以运行这个脚本,但请确保检查表名都是正确的。当你写完这篇文章和读到它的时候,事情可能会发生变化!

(root@al-g1 ~) # pg_dump - u postgres————插入——disable-dollar-quoting no-tablespaces no-security-labels localhost - h - w - t警报- t alert_notification - t alert_notification_state api_key - t - t - t annotation_tag alert_rule_tag - t注释- t cache_data仪表盘- t - t dashboard_acl - t dashboard_provisioning - t dashboard_snapshot - t dashboard_tag - t dashboard_version - t data_source - t data_source_acl - t login_attempt - t migration_log - t org - t - t playlist_item org_user - t播放列表- tplugin_setting -t preferences -t quota -t report -t server_lock -t session -t star -t tag -t team -t team_group -t team_member -t temp_user -t test_data -t user -t user_auth -t user_auth_token grafana | sed -r -e '/^SET/d' -e '/^SELECT pg_catalog/d' -e 's/——Data for Name: ([a-zA-Z0-9_]+)。*/TRUNCATE \1;/' -e 's/"user"/user/g' -e 's/INSERT INTO public。/插入/ ' e ' s /\\\"/\\\\\"/ g > grafana.psql

成功地将数据导入MySQL后,可以重新启动Grafana服务器,并验证所有配置都已成功导入。

我们希望这篇如何操作的博客文章对你有所帮助。查看更多提示,教程和解决方案-如果您有任何问题或要求,请告诉我们!bob彩票中奖计划