【Linux】Doris 安装部署
doris 安装部署
一、环境配置
1. 服务器环境
- centos 7
- docker 下载地址
- doris 1.0.0 下载地址
- doris 官方文档
- storrocks 官方文档
- 学习地址
二、安装docker
1. 使用xftp 等工具上传docker 安装包到linux服务器
2. 解压
tar -zxvf docekr-xxx.tgz
3. 复制压缩后的文件到指定文件夹
cp docker/* /usr/bin
4. 注册编辑docker服务
vim /etc/systemd/system/docker.service
如果无法使用vim 可以在windows上编辑好文件后上传至linux服务器的此目录内
参考docker.service:
1 | [Unit] |
5. 添加可执行权限
chmod +x /etc/systemd/system/docker.service
6. 一键三连
systemctl daemon-reload #
systemctl start docker # 启动服务
systemctl enable docker.service # 设置开机自启动
7. docker卸载
- 停掉docker服务
1 | systemctl stop docker |
- 查看yum安装的docker文件包
1 | yum list installed |grep docker |
- 删除所有安装的docker文件包
1 | yum -y remove docker.x86_64 |
- 查看rpm包是否还有
1 | rpm -qa |grep docker |
- 删除docker镜像放置的位置
1 | rm -rf /var/lib/docker |
三、安装Doris
1、编译
1). 使用【doris】源码,需要编译,这里直接使用物理机编译
a). 0.14.0版本之前版本依赖如下
1
GCC 7.3+, Oracle JDK 1.8+, Python 2.7+, Apache Maven 3.5+, CMake 3.11+ Bison 3.0+
如果使用Ubuntu 16.04 及以上系统 可以执行以下命令来安装依赖
1
sudo apt-get install build-essential openjdk-8-jdk maven cmake byacc flex automake libtool-bin bison binutils-dev libiberty-dev zip unzip libncurses5-dev curl git ninja-build python autopoint pkg-config
如果是CentOS 可以执行以下命令
1
sudo yum groupinstall 'Development Tools' && sudo yum install maven cmake byacc flex automake libtool bison binutils-devel zip unzip ncurses-devel curl git wget python2 glibc-static libstdc++-static java-1.8.0-openjdk
b). 在0.14.0 之后版本依赖如下
1
GCC 10+, Oracle JDK 1.8+, Python 2.7+, Apache Maven 3.5+, CMake 3.19.2+ Bison 3.0+
如果使用Ubuntu 16.04 及以上系统 可以执行以下命令来安装依赖
1
2
3
4
5sudo apt install build-essential openjdk-8-jdk maven cmake byacc flex automake libtool-bin bison binutils-dev libiberty-dev zip unzip libncurses5-dev curl git ninja-build python
sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa
sudo apt update
sudo apt install gcc-10 g++-10
sudo apt-get install autoconf automake libtool autopoint如果是CentOS 可以执行以下命令
1
2
3
4sudo yum groupinstall 'Development Tools' && sudo yum install maven cmake byacc flex automake libtool bison binutils-devel zip unzip ncurses-devel curl git wget python2 glibc-static libstdc++-static java-1.8.0-openjdk
sudo yum install centos-release-scl
sudo yum install devtoolset-10
scl enable devtoolset-10 bash**安装完成后,自行设置环境变量 PATH, JAVA_HOME 等。(可以通过alternatives –list命令找到jdk的安装目录) 注意: Doris 0.14.0 的版本仍然使用gcc7 的依赖编译,之后的代码将使用gcc10 的依赖 **
c). 下载源码
官网地址
d) 编译
上传源码到服务器后,解压文件,进入文件夹后,执行编译
1
2
3
4# 支持则使用下面命令进行编译
$ sh build.sh
# 如不支持需要加 USE_AVX2=0
$ USE_AVX2=0 sh build.sh编译完成后,产出文件在 output/ 目录中
2)、使用【starrocks】无需编译,直接部署即可,但CPU需支持【avx2】指令集
- 下载官方镜像 文档
2、部署环境准备
Linux 操作系统版本需求
Linux 系统 版本 CentOS 7.1 及以上 Ubuntu 16.04 及以上 软件需求
软件 版本 java 1.8+ GCC 4.8.2 及以上 操作系统安装要求
vi /etc/security/limits.conf
# 在末尾加入配置(表示:所有用户所有组,软限制和硬限制,对文件打开数,设为65535):
* soft nofile 65536
* hard nofile 65536
# 修改后需要断开远程工具(如Xshell等)后重新连接方可生效,或者,直接再临时修改一次,使用:
ulimit -n 65535
# 确认生效:
ulimit -nCPU检查
- 使用doris 编译的 可以跳过此检查;
- 使用storrocks 下载部署的,需要检查cpu是否支持
avx2
指令集
1
cat /proc/cpuinfo | grep avx2
有结果输出即表明CPU支持。如果无输出,则需要更换支持AVX2的机器。部分情况下,我们会在Windows系统下使用虚拟机安装CentOS作为测试环境,此时我们可以使用CPU-Z、AIDA64等工具在Windows下检查宿主机CPU的指令集支持情况。
操作系统检查
StarRocks要求系统为Linux CentOS 7及以上版本(下文演示使用CentOS 7.6),内核版本建议在3.10以上,查看系统及内核信息:
1
2
3
4[root@node01 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@node01 ~]# uname -a
Linux node01 3.10.0-1160.25.1.el7.x86_64 #1 SMP Wed Apr 28 21:49:45 UTC 2021 > x86_64 x86_64 x86_64 GNU/Linux时钟同步
Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。
网络需求
Doris、storrocks 各个实例直接通过网络进行通讯。以下表格展示了所有需要的端口
实例名 端口名称 默认端口 通信方向 说明 BE be_port 9060 FE–>BE BE 上 thrift server 的端口,用于接收来自 FE 的请求 BE webserver_port 8040 BE <–> BE BE 上的 http server 的端口 BE heartbeat_service_port 9050 FE –> BE BE 上心跳服务端口(thrift),用于接收来自 FE 的心跳 BE brpc_port 8060 FE <–> BE, BE <–> BE BE 上的 brpc 端口,用于 BE 之间通讯 FE http_port 8030 FE <–> FE,用户 <–> FE FE 上的 http server 端口 FE rpc_port 9020 BE –> FE, FE <–> FE FE 上的 thrift server 端口,每个fe的配置需要保持一致 FE query_port 9030 用户 <–> FE FE 上的 mysql server 端口 FE edit_log_port 9010 FE <–> FE FE 上的 bdbje 之间通信用的端口 Broker broker_ipc_port 8000 FE –> Broker, BE –> Broker Broker 上的 thrift server,用于接收请求 注:
- 当部署多个 FE 实例时,要保证 FE 的 http_port 配置相同。
- 部署前请确保各个端口在应有方向上的访问权限。
- 若上述端口不与服务器中其他服务的端口冲突,通常不建议修改。
- 以FE为例,部署前若需修改端口,可在配置文件fe/conf/fe.conf中修改为需要使用的端口(再次注意集群中FE的http端口需要一致,默认为8030):
1
2
3
4
5
6
7
8# store metadata, create it if it is not exist.
# Default value is ${STARROCKS_HOME}/meta
# meta_dir = ${STARROCKS_HOME}/meta
http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
mysql_service_nio_enabled = true配置防火墙,开放端口
防火墙开放集群实例默认端口命令:
firewall-cmd --zone=public --add-port=8000/tcp --permanent firewall-cmd --zone=public --add-port=8030/tcp --permanent firewall-cmd --zone=public --add-port=8040/tcp --permanent firewall-cmd --zone=public --add-port=8060/tcp --permanent firewall-cmd --zone=public --add-port=9010/tcp --permanent firewall-cmd --zone=public --add-port=9020/tcp --permanent firewall-cmd --zone=public --add-port=9030/tcp --permanent firewall-cmd --zone=public --add-port=9050/tcp --permanent firewall-cmd --zone=public --add-port=9060/tcp --permanent firewall-cmd --reload
查看开放的端口:
[root@node01 ~]# firewall-cmd --list-port 8030/tcp 8000/tcp 8060/tcp 9010/tcp 9020/tcp 9030/tcp 9050/tcp 9060/tcp 8040/tcp
安装JDK
StarRocks依赖JDK 1.8+环境,Oracle JDK 1.8+或OpenJDK8+均可以使用(下文演示使用OpenJDK 1.8.0_41):
[root@node01 ~]# java -version
openjdk version “1.8.0_41”
OpenJDK Runtime Environment (build 1.8.0_41-b04)
OpenJDK 64-Bit Server VM (build 25.40-b25, mixed mode)OpenJDK 8的安装操作见:文档:【Linux】安装OpenJDK.md
安装Mysql
StarRocks采用MySQL协议进行通信,用户可通过mysql-client连接到StarRocks集群。选 择mysql-client版本时要求采用5.1之后的版本,因为5.1之前不能支持长度超过16个字 符的用户名(下文演示使用mysql -client-5.7.35)。
为方便集群部署和运维,我们通常建议在集群服务器中选择一个节点安装mysql-client。当然,我们也可以不安装mysql-client,通过外部的SQLyog、DBeaver、Navicat等图形化工具直接访问StarRocks。
mysql 安装操作文档见:【Linux】CentOS7安装mysql5.7
3、安装部署
严格来说,StarRocks并没有所谓的“Standalone运行模式”,生产环境下更是不建议进行单实例部署。这里将单机部署整理出来,主要是考虑当用户测试环境受限于机器数量或仅希望验证功能,那么也可以在一台机器上简易部署把StarRocks跑起来。
以服务器“starrocks(172.18.88.54)”为例,在进行完部署环境的准备工作后,我们开始进行单节点的部署。
单节点架构设计如下:
机器节点 | 172.18.88.54(starrocks) |
---|---|
部署服务 | 1 FE(Leader) 1 BE1 Brokermysql-client |
部署目录及数据目录设计如下,后续的部署操作严格按照部署设计进行:
服务 | 说明 |
---|---|
FE | 部署目录:/opt/module/starrocks/fe 日志目录:/opt/module/starrocks/fe/log(默认)元数据目录:/opt/meta |
BE | 部署目录:/opt/module/starrocks/be 日志目录:/opt/module/starrocks/be/log(默认)数据目录:/opt/storage |
Broker | 部署目录:/opt/module/starrocks/apache_hdfs_broker |
1. 下载二进制包
StarRocks的二进制部署包可在官网下载获取:下载地址
doris 使用编译到output文件中的文件
这儿是用storrocks 为例,将下载好的部署包上传至 /opt/software
目录下
[root@starrocks ~]# mkdir /opt/software [root@starrocks ~]# cd /opt/software/ [root@starrocks software]# ll total 988752 -rw-r--r-- 1 root root 1012479814 Nov 22 15:46 StarRocks-1.19.2.tar.gz
2. 解压
[root@starrocks software]# tar xvf StarRocks-1.19.2.tar.gz [root@starrocks software]# ll total 988752 drwxrwxr-x 6 1007 1007 100 Nov 20 20:29 StarRocks-1.19.2 -rw-r--r-- 1 root root 1012479814 Nov 22 15:46 StarRocks-1.19.2.tar.gz
starrocks 目录结构:
StarRocks-1.19.2
├── apache_hdfs_broker # Broker目录
│ ├── bin
│ │ ├── start_broker.sh # Broker启动脚本
│ │ └── stop_broker.sh # Broker关闭脚本
│ ├── conf
│ │ ├── apache_hdfs_broker.conf # Broker配置文件
│ │ ├── hdfs-site.xml
│ │ └── log4j.properties
│ └── lib
│ └── *.jar # Broker依赖的jar包
├── be # BE实例目录
│ ├── bin
│ │ ├── common.sh
│ │ ├── show_be_version.sh # BE版本查看
│ │ ├── start_be.sh # BE启动脚本
│ │ └── stop_be.sh # BE关闭脚本
│ ├── conf
│ │ ├── be.conf # BE配置文件
│ │ └── hadoop_env.sh
│ ├── lib
│ │ ├── meta_tool # Tablet元数据离线管理工具 [1.19版本已合并入starrocks_be]
│ │ └── starrocks_be # BE可执行文件(小版本升级时替换即可)
│ └── www # BE Web页面文件
├── fe # FE实例目录
│ ├── bin
│ │ ├── common.sh
│ │ ├── show_fe_version.sh # FE版本查看
│ │ ├── start_fe.sh # FE启动脚本
│ │ └── stop_fe.sh # FE关闭脚本
│ ├── conf
│ │ ├── fe.conf # FE配置文件
│ │ └── hadoop_env.sh
│ ├── lib
│ │ ├── starrocks-fe.jar # FE jar包(小版本升级时替换即可)
│ │ └── *.jar # FE依赖的jar包
│ ├── log
│ │ └── *.log
│ └── webroot # FE Web页面文件
└── udf # 用户自定义函数目录 [重构中,目前不建议使用]
├── include
│ ├── uda_test_harness.h
│ └── udf.h # UDF框架头文件
└── lib
└── libStarRocksUdf.a # UDF框架静态库文件
3. 分发部署文件
# 重命名
[root@starrocks software]# mv /opt/software/StarRocks-1.19.2 /opt/software/starrocks
# 移动文件到module目录下
[root@starrocks software]# mv /opt/software/starrocks /opt/module/starrocks/
[root@starrocks software]# cd /opt/module/starrocks/
[root@starrocks starrocks]# ll
total 0
drwxr-xr-x. 5 1021 1021 40 Nov 22 14:40 apache_hdfs_broker
drwxr-xr-x. 6 1021 1021 51 Nov 22 14:40 be
drwxr-xr-x. 8 1021 1021 83 Nov 22 14:52 fe
drwxr-xr-x. 4 1021 1021 32 Nov 22 14:40 udf
4. 部署fe
修改FE配置文件
StarRocks各服务配置文件的默认配置已经足以启动集群,不建议初尝用户修改较多配置。FE的配置文件在测试环境中我们通常只需要关注以下三点:
a、注意默认端口,避免端口冲突,正常情况下不需要修改;
b、绑定IP,避免多网卡情况下服务无法自动匹配到正确的IP。特别注意,绑定ip时,如果不清楚CIDR表示法,可以直接填写完整的ip(不支持别名),例如配置为priority_networks = 172.18.88.54/24;该地址可以使用
ip addr show
的方式查询c、设置元数据目录,默认目录为fe/meta,我们建议新建目录并修改配置文件。
根据部署设计,创建元数据存储目录:
[root@starrocks starrocks]# mkdir /opt/meta
针对b和c修改配置文件(带#的为注释,红色字体为新增配置):
[root@starrocks starrocks]# vi /opt/module/starrocks/fe/conf/fe.conf # store metadata, create it if it is not exist. # Default value is ${STARROCKS_HOME}/meta # meta_dir = ${STARROCKS_HOME}/meta # 修改此处 meta_dir = /opt/meta ………… # Choose one if there are more than one ip except loopback address. # Note that there should at most one ip match this list. # If no ip match this rule, will choose one randomly. # use CIDR format, e.g. 10.10.10.0/24 # Default value is empty. # priority_networks = 10.10.10.0/24;192.168.0.0/16 # 修改此处 priority_networks = 192.168.110.98
配置环境变量
# 配置环境变量 vim /etc/profile.d/doris.sh export DORIS_HOME=Doris根目录 # 例如/opt/doris export PATH=$PATH:$DORIS_HOME/fe/bin:$DORIS_HOME/be/bin # 保存并source source /etc/profile.d/doris.sh
启动FE
[root@starrocks starrocks]# cd /opt/module/starrocks/fe/bin/ # --daemon 后台运行 [root@starrocks bin]# ./start_fe.sh --daemon
补充:关闭FE的脚本是stop_fe.sh,命令:./stop_fe.sh
FE使用Java语言编写,使用jps命令查看java进程,若发现有StarRocksFe进程,即为启动成功:
[root@starrocks bin]# jps 5178 Jps 5164 StarRocksFe
如果进程状态异常可在FE日志目录中查看日志追踪原因,FE的主要日志在fe.log中,所有查询的审计日志在fe.audit.log中。由于是初次启动,如果在操作过程中遇到比较耗时的问题,可以清空FE的元数据目录,再从头开始操作。
访问FE
使用mysql-client访问FE,FE查询端口默认为9030,自带用户root,默认密码为空:
[root@starrocks bin]# mysql -h172.18.88.54 -P9030 -uroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.1.0 ……………… mysql>
确认FE状态
若mysql-client能够正常访问FE,已说明FE状态正常,查询命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20mysql> show frontends\G
*************************** 1. row ***************************
Name: 172.18.88.54_9010_1651209869733
IP: 172.18.88.54
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: FOLLOWER
IsMaster: true
ClusterId: 1166088853
Join: true
Alive: true
ReplayedJournalId: 803
LastHeartbeat: 2022-04-29 14:11:57
IsHelper: true
ErrMsg:
Version: 0.14.0-release-Unknown
1 row in set (20.04 sec)Alive为true即说明FE节点状态正常。
校验FE启动是否成功
- 检查是否启动成功, JPS 命令下有没有 PaloFe 进程
- FE 进程启动后,会⾸先加载元数据,根据 FE ⻆⾊的不同,在⽇志中会看到 transfer from UNKNOWN to MASTER/FOLLOWER/OBSERVER 。最终会看到 thrift server started ⽇志,并且可以通过 mysql 客户端连接到 FE,则 表示 FE 启动成功。
- 也可以通过如下连接查看是否启动成功: http://fe_host:fe_http_port/api/bootstrap 如果返回: {“status”:”OK”,”msg”:”Success”} 则表示启动成功,其余情况,则可能存在问题。
- 外⽹环境访问 http://fe_host:fe_http_port 查看是否可以访问WebUI界 ⾯,登录账号默认为root,密码为空
注:如果在 fe.log 中查看不到启动失败的信息,也许在 fe.out 中可以看到。
添加实例进入集群
我们先将添加BE与Broker实例添加入集群。这里需要说明一下,“启动服务”和“将服务添加入集群”并没有严格的先后顺序,但若先启动服务,在实例未加入集群前,BE的日志中会打印一些提示未加入集群的WARNING信息,例如:Fail to get master client from cache。所以我们可以在FE全部部署完成后,使用mysql-client将集群中其他实例通过SQL添加入集群,然后再逐个部署启动。
添加BE进入集群,端口使用BE的heartbeat_service_port(默认为9050):
mysql> alter system add backend '172.18.88.54:9050'; Query OK, 0 rows affected (0.10 sec)
若添加实例进入集群时信息输入有误或出现其他异常,我们可以将其删除后重新添加,删除示例:
从集群中删除BE(当前仅有一个BE实例,故删除时可以直接使用dropp命令删除。删除BE为高风险操作,所以这里的删除命令设计为了dropp):
mysql> alter system dropp backend '172.18.88.54:9050'; Query OK, 0 rows affected (0.09 sec)
添加Broker进入集群时需要给Broker设定名称,比如命名为hdfs_broker,端口使用Broker的broker_ipc_port(默认为8000):
mysql> alter system add broker hdfs_broker '172.18.88.54:8000'; Query OK, 0 rows affected (0.03 sec)
从集群中删除Broker:
mysql> alter system drop broker hdfs_broker '172.18.88.54:8000'; Query OK, 0 rows affected (0.04 sec)
暂时退出StarRocks:
mysql> exit
Bye
5. 部署BE实例
修改BE配置文件
- BE的配置文件,在测试环境通常也是关注如下三点:
- 注意默认端口,避免端口冲突,正常情况下不需要修改;
- 绑定IP,避免多网卡情况下无法自动找到正确的IP(同样,不清楚CIDR就可以直接填写完整的IP);
- 设置数据存储目录,默认目录为be/storage,我们建议新建目录并修改配置文件。
- 新建BE数据存储目录:
[root@starrocks bin]# mkdir /opt/storage
- 针对b和c修改配置文件(带#的为注释,红色字体为新增配置):
[root@starrocks bin]# vi /opt/module/starrocks/be/conf/be.conf # Choose one if there are more than one ip except loopback address. # Note that there should at most one ip match this list. # If no ip match this rule, will choose one randomly. # use CIDR format, e.g. 10.10.10.0/24 # Default value is empty. # priority_networks = 10.10.10.0/24;192.168.0.0/16 # 修改此处 priority_networks = 172.18.88.54/24 ………… # you also can specify the properties by setting '<property>:<value>', seperate by ',' # property 'medium' has a higher priority than the extension of path # # Default value is ${STARROCKS_HOME}/storage, you should create it by hand. # storage_root_path = ${STARROCKS_HOME}/storage # 修改此处 storage_root_path = /opt/storage
启动BE
[root@starrocks bin]# cd /opt/module/starrocks/be/bin/ [root@starrocks bin]# ./start_be.sh --daemon
补充:关闭BE脚本为stop_be.sh,命令:./stop_be.sh
BE使用C++编写,使用ps命令查看进程,若发现有starrocks_be进程,即为启动成功:
[root@starrocks bin]# ps -ef | grep starrocks_be root 6670 1 1 19:46 pts/0 00:00:00 /opt/module/starrocks/be/lib/starrocks_be
如果进程状态异常可在BE日志目录中查看日志追踪原因,BE的主要日志在be.INFO中,其他的日志在be.out中。
查看BE状态
[root@starrocks bin]# mysql -h127.0.0.1 -P9030 -uroot
mysql> show backends\G *************************** 1. row *************************** BackendId: 11001 Cluster: default_cluster IP: 172.18.88.54 HeartbeatPort: 9050 BePort: 9060 HttpPort: 8040 BrpcPort: 8060 LastStartTime: 2022-04-29 14:01:04 LastHeartbeat: 2022-04-29 14:02:11 Alive: true SystemDecommissioned: false ClusterDecommissioned: false TabletNum: 0 DataUsedCapacity: .000 AvailCapacity: 34.793 GB TotalCapacity: 49.976 GB UsedPct: 30.38 % MaxDiskUsedPct: 30.38 % ErrMsg: Version: 0.14.0-release-Unknown Status: {"lastSuccessReportTabletsTime":"2022-04-29 14:02:10"} 1 row in set (20.04 sec)
一般Alive为true即为状态正常,若为false,可根据日志排查问题。同样的,因为当前BE为初次启动,如果出现无法快速定位的问题,可以清空storage数据目录,重新启动服务。
6. 部署Broker
在部署完FE与BE后,StarRocks主要服务已经部署完成。Broker是StarRocks与外部HDFS/对象存储等外部数据对接的中转服务,若不需要可以不部署。Broker本身是无状态的进程,可以随意启停,不影响集群。
修改Broker配置文件
Broker的配置文件通常不需要修改。与FE实例和BE实例不同,Broker当前没有也不需要priority_networks这个选项。Broker的服务默认绑定在0.0.0.0上,我们只需在前面4.5节 ADD BROKER时,输入正确可访问的BROKER IP即可。
启动Broker
[root@starrocks bin]# cd /opt/module/starrocks/apache_hdfs_broker/bin/ [root@starrocks bin]# ./start_broker.sh --daemon
补充:关闭Broker脚本为stop_broker.sh,命令:./stop_broker.sh
查看java进程,若发现有BrokerBootstrap即为启动成功:
[root@starrocks bin]# jps | grep BrokerBootstrap 7594 BrokerBootstrap
Broker日志在apache_hdfs_broker.log中,如果进程状态异常可查看日志追踪原因。
查看Broker状态
[root@starrocks bin]# mysql -h127.0.0.1 -P9030 -uroot
mysql> show broker\G *************************** 1. row *************************** Name: hdfs_broker IP: 172.18.88.54 Port: 8000 Alive: true LastStartTime: 2021-11-25 20:19:56 LastUpdateTime: 2021-11-25 20:21:31 ErrMsg: 1 row in set (0.01 sec)
Alive为true即为状态正常,如果状态异常可以根据日志定位问题。
4、简单使用
1. 修改root账户密码
例如修改root密码也为root:
mysql> set password=password('root');
Query OK, 0 rows affected (0.02 sec)
2. 建库建表
StarRocks的副本数是不能大于BE节点数的,由于当前仅有一个BE节点,我们建表时务必注意指定数据为单副本,示例如下:
新建一个starrocks数据库:
mysql> create database starrocks;
Query OK, 0 rows affected (0.01 sec)
mysql> use starrocks;
Database changed