文章目录
- MongoDB源码编译
- 准备安装包
- 安装gcc
- 升级Python
- 安装Python模块
- 编译安装
- 编译过程报错
- 配置Mongdb
- 创建文件夹
- 修改配置文件
- 清理压缩生成的mongo文件
- 启动MongoDB
- 启动过程报错
- 创建超级用户
- 创建数据库
- 连接MongoDB
- 创建数据库
- 访问MongoDB
- 操作MongoDB
- 启动MongoDB
- 关闭MongoDB
MongoDB源码编译
准备安装包
下载地址:Release r5.0.5 · mongodb/mongo (github.com)
选择版本
上传: /opt/package
解压: mongo-r5.0.5.tar.gz
tar -zxvf /opt/package/mongo-r5.0.5.tar.gz -C /opt/package
查看构建文档 /opt/package/mongo-r5.0.5/docs/building.md
所以编译MongoDB前需要满足上面的条件
安装gcc
下载地址:gcc-9.5.0.tar.gz
上传:/opt/package
解压:gcc-9.5.0.tar.gz
tar -zxvf /opt/package/gcc-9.5.0.tar.gz -C /opt/package
安装依赖
# 安装依赖
yum -y install bzip2 wget
# 进入gcc-9.5.0目录
cd /opt/package/gcc-9.5.0
# 在解压根目录中执行
./contrib/download_prerequisites
编译
# 创建编译目录
cd ../ && mkdir gcc-build-9.5.0 && cd gcc-build-9.5.0
# 配置
../gcc-9.5.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
# 用32核心编译
# 需要等待很久,视机器性能而定
make -j32
# 安装
make install
# 切换gcc到新版本
update-alternatives --install /usr/bin/gcc gcc /opt/gcc-5.3.0/gcc-5.3.0
升级Python
因为centos7用yum安装的python3版本是3.6.8(估计是这个系统的yum源没更新适配),我们需要升级到3.7.x版本
下载源码地址找到3.7版本: Python Source Releases | Python.org
解压后切换到解压包目录,进行预编译 -> 编译 -> 编译安装
# 安装依赖
yum groupinstall -y "Development tools"
yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel
# 预编译,设置安装目录为/usr/local/python3。安装目录可以自定义
./configure --prefix=/usr/local/python3
# 编译。因为CPU8核,所以设置-j8加快编译速度
make -j8
# 编译安装
make install -j8
安装Python模块
# 安装 scons
pip3 install scons
# 安装环境
yum install python3-devel
# 安装Python模块
python3 -m pip install -r /opt/package/mongo-r5.0.5/etc/pip/compile-requirements.txt
编译安装
python3 buildscripts/scons.py DESTDIR=/opt/software/mongodb install-core MONGO_VERSION=5.0.5
编译过程报错
In function 'char* strncpy(char*, const char*, size_t)',
inlined from 'mongo::mozjs::JSStringWrapper::JSStringWrapper(int32_t)' at src/mongo/scripting/mozjs/jsstringwrapper.cpp:48:12:
/usr/include/x86_64-linux-gnu/bits/string_fortified.h:106:34: error: 'char* __builtin_strncpy(char*, const char*, long unsigned int)' specified bound 64 equals destination size [-Werror=stringop-truncation]
106 | return _builtin_strncpy_chk (dest, __src, __len, __bos (_dest));
方法1:
后来发现官方的构建文档也有说明
要忽略这个警告可以加上–disable-warnings-as-errors 这个参数
方法2:需要修改mongo的代码,估计是这个版本官方的一个bug,在mongo源码目录下
vi src/mongo/scripting/mozjs/jsstringwrapper.cpp
# 找到48行删除,添加两行
strncpy(_buf, formatted.c_str(), sizeof(_buf) - 1);
_buf[sizeof(_buf) - 1] = '\0';
修改之后的代码如下:
配置Mongdb
上面我们加了DESTDIR=/opt/software/mongodb,构建好的mongodb就在这个目录下了
设置环境变量
编辑 /etc/profile
vim /etc/profile
在末尾添加内容
#MongoDB Env
export MONGODB_HOME=/opt/software/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
立即生效
source /etc/profile
创建文件夹
创建数据库文件夹
mkdir -p /mnt/data/mongodb/db
创建日志文件夹
mkdir -p /mnt/data/mongodb/logs
修改配置文件
创建配置文件mongodb.conf
文件路径:/opt/software/mongodb/bin/mongodb.conf
vim /opt/software/mongodb/bin/mongodb.conf
dbpath = /mnt/data/mongodb/db #数据文件存放目录
logpath = /mnt/data/mongodb/logs/mongod.log #日志文件存放目录
journal=false
auth=true
# bind_ip_all = true # 任何机器可以连接
# bind_ip = 127.0.0.1,192.168.0.3 # 本机和192.168.0.3可以访问
bind_ip = 0.0.0.0
port = 27017 # 实例运行在27017端口(默认)
logappend = true # 启动时 添加还是重写日志文件
fork = true # 是否后台运行
清理压缩生成的mongo文件
linux中的strip命令简介------给文件脱衣服 本来生成的文件大小都是GB级别
使用strip命令清理mongodb/bin下的三个文件
瞬间变成几十M!!!
启动MongoDB
启动
mongod -f /opt/software/mongodb/bin/mongodb.conf
启动过程报错
这是因为链接的libstdc++版本有点低strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
在上面a安装gcc的路径搜索
find ./ -name libstdc++.so.6*
拷贝到/usr/lib64路径下
cp ./aarch64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28 /lib64/
# 把原来的软链接删除
mv /lib64/libstdc++.so.6 /lib64/libstdc++.so.6_back
# 创建新的软链接
ln -s /lib64/libstdc++.so.6.0.28 /lib64/libstdc++.so.6
再次使用命令启动就行啦!!!
登录网址
有以下内容表示MongoDB启动成功
创建超级用户
MongoDB 没有无敌用户root,只有能管理用户的用户 userAdminAnyDatabase
连接mongoDB服务器端
mongo
进入admin数据库
use admin
创建用户
用户权限列表:
Read:允许用户读取指定数据库。
readWrite:允许用户读写指定数据库。
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile。
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户。
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限。
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限。
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用,超级账号,超级权限。
模板:
db.createUser({
user:用户名,
pwd:密码,
roles:[
{ role:权限类型, db:可访问的db}]
})
例:
创建超级用户
db.createUser({
user: "root",
pwd: "root_123",
roles: [ { role: "root", db: "admin" } ]
})
创建数据库
连接MongoDB
指定用户进入MongoDB: mongo admin -u 用户名 -p 密码
mongo admin -u root -p
Enter password:
root_123
创建数据库
# 没有则会自动创建
use ga
访问MongoDB
用Navicat连接MongoDB
测试连接,能连接成功即可
操作MongoDB
启动MongoDB
mongod -f /opt/software/mongodb/etc/mongodb.conf
关闭MongoDB
使用超级用户登录MongoDB
mongo admin -u root -p
Enter password:
root_123
进入admin数据库
use admin
关闭MongoDB
db.shutdownServer();