那么SQL类系统顾名思义就是使用 SQL 语言来对数据库中的数据进行操作的这种数据库系统,通常指的是这种关系性的数据库系统,比如我们常见的 MySQL,Oracle,SQLServer或者是PostGreSQL等等,而 NOSQL 则主要指的是不使用 SQL 语言来操作数据库中数据的系统。 虽然 NOSQL 本身它的意思是 no only sql,也就是不仅仅有 sql 的意思,但是不得不说这类系统大多数都并不是以 sql 语言来操作数据的,并且这类系统通常都是非关系型数据库比如 MongoDB,Redis等等。近年来 NOSQL 系统大行其道,并且有一种说法, NOSQL 最终会替代 SQL 数据库成为数据存储系统的主力。 不过从目前来说, SQL 和 NOSQL 的系统使用情况来看,SQL 类系统还是处于绝对的霸主地位的,其实也并没有什么系统是能适合所有业务的,SQL 系统 和 NOSQL 系统都有它们所擅长的领域。那么下面我们就分别来看一下这两种数据库存储系统的特点和它们所适用的应用领域。
我们可以看到在这个表中一共有三行数据,每一行数据都具有相同的列属性,比如说姓名、性别、生日和注册时间,这些都是列属性,这个就是一个标准的二维表。 当然了这种情况现在也有了一些变化,目前在很多的关系型数据库中都支持Json类型的列数据类型,【JsonField ORM Python 需要MySQL8.0】那么在 Json 类中我们可以存储非结构化的数据,这就是关系型数据库,也具有了一些非关系型数据库的特点,可以存储非结构化的数据,但是这也仅限于使用 Json 这种类型的列,从整体上来看关系型数据库的结构还是这种结构化的。 那么关系型数据库系统的第二个特点就是支持事务的ACID特性,也就是说是事务的原子性、一致性、隔离性和持久性,可以保证存储在数据库中的数据是完整的,不会出现一个事务中的多条 SQL 只有部分被成功执行的情况,也不会出现丢失了已提交事务的对数据修改的这种情况。最后关系型数据库都是支持使用 SQL 语言来对数据库中的数据进行操作的,SQL 语言可以灵活的对数据库中的数据进行组合并操作,那么还可以对多个表通过关联关系来进行关联的查询,这一点是很多非关系型数据库很难做到的。 那么了解了关系型数据库的特点,我们就不难看出关系型数据库的一些适应场景了。 首先如果我们的业务数据之间是存在着某种关联关系的,并且需要通过这些关系来操作存储在数据库中的数据,那样就非常适合使用关系型数据库了。 那么什么是数据库之间的关系?这里我们来举一个例子,比如订单和订单商品之间就存在着关系,我们一个订单可以包括多个商品,而某一个订单中的商品它只能属于一个订单,再比如我们在 CSDN 上来发一篇博客,那么这个博客就只能属于一个人,而一个人就可以发行多篇博客,那么这个东西就叫做关系。 所以我们可以发现大多数情况下,我们都可以使用关系型数据库来解决我们数据的存储问题。 再有如果我们的业务场景是需要严格的保证所存储数据的完整性的话,就需要这个数据存储系统对事务进行完全的支持,这时也就只能使用关系型数据库系统了。 比如在一些金融类的电商类的应用中,毕竟我们谁也不会希望自己的账户中的钱莫名其妙的就会减少,而只有关系型数据库是可以保证做到事务的完整性。 最后如果我们需要对数据进行灵活的统计分析,需要利用 SQL 语言来处理存储的数据的话,那么也建议使用关系型数据库系统,毕竟我们把数据保存在数据库中是为了使用的,而只有关系型数据库系统可以完美的支持SQL 语言。 虽然也有非关系型数据库,现在开始来支持 SQL 语言了,但是其对 SQL 语言特性的支持还是很有限的。
那么以 Json 格式存储的话,我们可以看到张三李四和王二这三个人可以具有不同的属性,相比于关系型数据库系统来说要灵活的多,不用一开始就把这个数据结构固定下来,但是也有一些问题,这就是每一行数据都要包括列数据之外,还要包括我们的列名,如果不考虑压缩的情况下,从存储空间的占用上来说,通常来说存储相同的数据,非关系型数据库要比关系型数据库占用更多的存储空间。那么同时由于非关系型数据库大都是不会完全支持事务的所有特性的,所以在查询和写入数据时,也不用对数据的完整性来进行检查,所以读写效率上通常要比关系型数据库要高,非常适合使用在日志处理的业务场景中。 最后非关系型数据库大都是不是用 SQL 语言来进行操作的,比如 MongoDB,ta使用的就是 JavaScript 来操作数据的,那么除了上面说过的日志类处理的场景之外,非关系型数据库还适合使用在哪些场景下呢? 首先就是我们无法固定数据结构的场景,比如我们要存储产品的属性数据,由于每类产品的储量的数量都是不完全相同的,有的产品可能是具有产地,重量,长宽这些属性,而有的产品则可能会具有诸如这种颜色,味道这些属性,所以就比较适合于使用 MongoDB 这样的数据库来进行存储。 还有对事务的完整性要求并不是十分严格的应用场景,如果这种应用场景下读写的并发又非常大,那就更加适合于使用非关系型数据库了。 比如前面提到过的这种日志监控类的应用,以及用户行为分析类的应用,那么这类应用的共同特点就是对数据的这种完整性要求不高,比如我们偶尔丢失一些数据,也并不会对用户的整个行为带来什么太大的影响。 同时在用户的操作行为比较频繁的情况下,数据量和并发量都会比较大,这就不适合使用关系型数据库来进行存储了。 那么最后由于非关系型数据库大多都是不支持 SQL 语言的,所以无法做到对数据的灵活处理,所以也比较适合工作在对数据处理需求比较简单的场景下,那么比如只是要求简单的数据汇总等等,在这种场景下也是可以使用非关系型数据库。 那么以上就是关系型数据库和非关系型数据库的特点和它们各自比较适合的场景。 那么在实际工作中,大家都可以根据自己的业务特点,分析并选择自己所要使用的数据的存储系统。

安装好之后我们来打开 Docker ,这个主要是帮我们启动了一个 Docker 的引擎,我们看它到这儿是正在启动这个状态,当它启动起来以后,我们打开一个命令行窗口,等他现在已经启动起来了。
好,我们先来认识一下 Docker,先在命令行里面输入命令 Docker ,
看这就是 Docker 的命令行,Docker 它的操作方式主要是靠命令行的方式。在我们认识 Docker 命令之前,我们先要明白两个 Docker 的基本概念,第一个基本概念叫做 image,什么是 image?我们简单的来理解它就是一个镜像。 第二个就是 container,container 就相当于是我们镜像起的一个实例。打一个比方,镜像就相当于是我们 Windows 系统的安装光盘,我们 container 就相当于是我们拿镜像盘我们安装了 Windows 的系统,可以在系统里面做一些事情,我们 Docker 上面这些镜像它是怎么的一个管理方式呢? 我们打开一个网站叫 https://hub.docker.com/,这是 Docker 的镜像网站,在这个网站上面,它管理了好多的我们常用的镜像,比如说我们常用的 MySQL 镜像,在这里我们输入 MySQL,这里面搜出来第一个这是我们需要的 MySQL 镜像 ,
新页面打开它 https://hub.docker.com/_/mysql 就是 MySQL 镜像的介绍,下面包括 MySQL 镜像的一些使用。
https://hub.docker.com/search?q=mysql&type=image
大家看 MySQL 其实我们这么理解的,它并不是说镜像里面只有一个 MySQL,它是整个包含我们底层需要用到的Linux系统,在这个系统上面ta在装了一个 MySQL,相当于我们把镜像安装到我们 container 里面去,我们这上面就相当于是一个整个的 MySQL 运行环境,我们可以简单的把一个运行起来的MySQL container ,当做是 MySQL 的一个服务器。 首先我们看怎样把我们MySQL 镜像给拉取到我们本地。
这里面它有一个 docker pull mysql,一般 docker pull mysql 拉取的是 MySQL 镜像的最新版本,我们有时候也需要它的历史版本,
然后如图所示点开,看它的历史版本,
这个历史版本有各种,latest八点几,还有5.7等等这些,我们需要一个历史版本的时候,
我们执行:docker pull mysql:5.7
问题:docker: no matching manifest for linux/arm64/v8 in the manifest list entries. 原因:
参考链接:docker-apple-silicon-m1 https://docs.docker.com/desktop/mac/apple-silicon/总结: 遇到问题,我们第一步是理解问题,这是个什么问题? 可以借助搜索来帮助我们理解问题,见参考链接, 我们知道了这是docker app m1 兼容性的坑,怎么做? 如下:docker pull --platform linux/x86_64/v8 mysql:5.7
这样的话就把镜像拉取到我们本地了,相当于我们把一个 Windows 的光盘下载下来,那么把这个光盘下载下来之后,我们怎么来启动它?完整命令:docker run --name=mysql-test -e MYSQL_ROOT_PASSWORD=ZXCzxc123 -d --platform linux/x86_64 mysql:5.7
你可以参考学习,也可直接忽略此步骤: 网址是:https://hub.docker.com/_/mysql?tab=description
我们来看这里,下面有ta的一个命令介绍,需要加一些参数,比如 –name -e -d 啥的, 我们在命令行输入 docker run --help 来看一下。
首先我们看看-d。
这是在后台启动了一个我们的镜像, 然后第二个 --name,
这是给我们的 container【容器】 起一个别名, 别名是什么意思?
我们看 container,首先它有container ID,我们在container的start stop操作的时候,我们可以用它的 ID来操作,但是这个ID毕竟不是太方便,所以ta还起了一个别名叫NAMES,
我们在操作的时候,比如说docker start一个 container,我们就可以start myjenkins或者micro-mysql,我们可以这么来操作,这样会让我们操作更方便一些。【同样的道理,域名是不是比ip地址好记一点?】-e的话,我们看一下它的一个定义是什么?
这是environment value,相当于在我们 container 启动之后,container 的内部设置了一些环境变量,这样的话我们可以把外面的一些设置给到我们的 container 里面去。 在这里docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag我们就相当于在mysql container里面,我们设置了一个 MYSQL_ROOT_PASSWORD 环境变量,在它 这个 container 启动的时候会读一下我们这个环境变量,读取之后就把它设置成 mysql 的一个root密码。 通过这样的方式,我们指定了镜像里面 mysql 的一个root password,后面这个mysql:tag就是我们的image的镜像。那么下面我们run 一个 mysql的镜像, 然后我们加一个环境变量,我们给它设置一个简单的 password,在测试环境里面我们可以设置一个简单的password,大家如果在线上用的时候 password 还是要复杂一点, 然后-d后面启动一个mysql5.7的镜像。
docker ps -a,这样镜像就有了,
容器 ID 是 f32287b0de02 镜像 ID 是 mysql:5.7, 我们看这里我们后面给它起的名字 NAMES 叫 mysql-test, 这样的话就相当于是我们已经跑起来了这个镜像,在我们的机器上面相当于是有一台 mysql 的服务器了。我们的 container 跑起来之后 怎么样 来登录到这个 container 上面去。 我们用到一个命令叫 docker exec --help,
我们看一下它的格式,这里面我们需要用到两个参数,杠i和杠t。 杠t的话就相当于帮我们打开一个模拟的命令行窗口, 杠i的话就是保持标准输入的连接, 这两个加起来相当于是保持和我们的 container 相互交互的命令行。 我们来打开 container 。docker exec -it mysql-test /bin/bash
这样的话大家看前面的提示变了,就相当于我们直接登录了 mysql 服务器的root账号下。
我们来 ls 一下,显示的是我们 mysql container 里面的机器的一些文件,在这上面就可以直接操作 container 里面的东西了。像刚才说我们直接执行mysql -uroot -pZXCzxc123,
这样的话就是我们 mysql 内部的这些环境, 执行show databases;
就是查看数据库,这里可以看到一些默认的库, exit直接退出,
这样就回到我们自己的容器命令行里面了,回到我们本机了。 我们的 container 怎么来管理? 比如说我们有时候在配置完一些环境的时候,我们需要重启一下 container,怎么做?我们先查看一下 container 名字, docker ps docker ps 命令会把我们所有运行起来【Up】的 container 给展示出来。 如果我们电脑重启了以后,我们这些 container 其实就没有自动跑起来了,怎么样找到我们之前的这些 container,输入命令叫docker ps -a就把我们所有的 container 都给显示出来,【Up 和 Exited 】
大家看这里面有我们之前跑起来的容器以及它的一个状态, Exited 是已经退出了,相当于我们的机器已经关了。 Up 正常状态。我们想把 container 重启一下怎么办?docker restart container_id/namesdocker ps,
如果我们重启完之后,相当于我们只启动了2秒了, 重启起来之后我们怎么来关闭它?docker stop container_id/namesdocker ps,
我们再来启动 mysql-test,
以上是 docker 基础的使用命令,当然 docker 其实还有其他更多复杂的命令,包括ta的镜像管理镜像生成等等这些,大家有兴趣的话,就看一下ta的官方文档, https://docs.docker.com/ 试着来操作一下。docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=ZXCzxc123 -d --platform linux/x86_64 mysql:5.7
接下来我们再创建一个 slave 镜像, 命令:docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=ZXCzxc123 -d --platform linux/x86_64 mysql:5.7
那么执行完上面两个命令以后,我们就创建了两个 docker 的container,我们再打开一个命令行,我们先到 master 的容器里面去,操作命令如下:docker exec -it mysql-master /bin/bash
大家看我们前面的提示已经到了我们的容器里面来了,提示组成是root@Container ID,相当于我们已经登录到容器里面了,这个机器是一个Linux的环境,我们登录 mysql 默认的 root 账号:mysql -uroot -pZXCzxc123
那么接下来我们就要给外部来加一些账号, 为指定的数据库配置 指定的账户。 我们创建一个账号,操作指令如下:create user "user_keagen"@"%" IDENTIFIED BY "ZXCzxc123";
我们新建用户 user_keagen,可以给他指向我们所有的机器,配置了任意ip都可以连入数据库的账户。 创建完账号以后,继续操作: 我们设置权限账号密码,操作指令如下: https://tableplus.com/blog/2019/09/access-denied-for-user-root-localhost-mysql.html# 设置权限账号密码
# 授权账号命令:grant 权限(create, update) on 库.表 to '账号'@'host' identified by '密码'#1. 配置任意ip都可以连入数据库的账户
GRANT ALL PRIVILEGES ON *.* TO "user_keagen"@"%" IDENTIFIED BY "ZXCzxc123";
#2. 由于数据库版本的问题,可能本地还连接不上,就给本地用户单独配置
grant all privileges on *.* to 'user_keagen'@'localhost' identified by 'ZXCzxc123';
# 可以使用以下语句访问 MySQL 授权表SHOW GRANTS来检查权限并根据需要进行更改:
SHOW GRANTS FOR 'user_keagen'@'localhost';
# 完成后,刷新权限:
FLUSH PRIVILEGES;
#3. 刷新一下权限
flush privileges;
我们在命令行这样连接数据库,操作指令如下:mysql -h127.0.0.1 -P3339 -uuser_keagen -pZXCzxc123
问题描述: mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2003 (HY000): Can’t connect to MySQL server on ‘127.0.0.1’ (111) 原因:在命令行界面上使用密码可能不安全。 我们这样操作:ALTER USER "user_keagen"@"%" IDENTIFIED WITH mysql_native_password BY "ZXCzxc123";
ALTER USER "user_keagen"@"localhost" IDENTIFIED WITH mysql_native_password BY "ZXCzxc123";
解决了:【用localhost代替127.0.0.1】
这样我们就可以连接我们的 mysql 服务了。接下来我们在容器里面要修改我们的 mysql 的配置 来配置主从。
我们默认的 mysql 配置文件在哪?cd /etc/mysql
ls
我们先执行两个命令:apt-get update
apt-get install vim
我们把 my.cnf 文件打开,添入以下内容:[client]
port=3306
user=mysql
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
user=mysql
character-set-server = utf8mb4
default_authentication_plugin=mysql_native_password
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure_file_priv= NULL
symbolic-links=0
server-id=100
log-bin=mysql-bin
主要配置是: 第一个是server-id=100 , 第二个是log-bin=mysql-bin, server-id=100 指的是我们的一个数据库在局域网内的一个唯一ID,在这里大家其实需要注意一下,我们的主库ID master ID一定要比slave ID 从库的 serve ID 要小, 我们加上这两个配置以后,我们重启容器,然后我们的 mysql 主数据库的 BinLog 就生效了。
查看主服务器状态(显示如下图):
我们的主数据库就已经生效了, 在我们 Docker 内部,容器之间 的 IP相对是独立的, 到我们的本机的环境下面,这是我们自己的机器,不是我们的 docker 容器, 这里我们用 docker 命令来查看一下, container 的 IP 都是多少,操作命令如下:docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress}}' $(docker ps -aq)
我们通过这个命令我们就取出来 container 里面 master 和 slave 这两个机器IP, 我们在 master 容器内找 slave 容器的IP,就用 这个IP 172.17.0.3。 我们在 slave 容器内找 master 容器的IP,就用 这个IP 172.17.0.4。| 环境) | mysql版本 | ip地址:端口号 |
| 主库(master) | 5.7 | 172.17.0.3:3339 |
| – | – | – |
| 从库(slave) | 5.7 | 172.17.0.4:3340 |
mysql -uroot -pZXCzxc123
create user "slave"@"%" IDENTIFIED BY "ZXCzxc123";
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO "slave"@"%";
flush privileges;
在从数据库上,步骤如下:我们把 my.cnf 文件打开,添入以下内容:[client]
port=3306
user=mysql
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
user=mysql
character-set-server = utf8mb4
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure_file_priv= NULL
symbolic-links=0
server-id=101
log-bin=mysql-slave-bin
relay_log=keagen-mysql-relay-binmysql -uroot -pZXCzxc123docker restart mysql-slavemysql -uroot -pZXCzxc123
show master status;
我们需要记一下: mysql-bin.000004 154 接下来进入从库,在我们的从库下面,mysql -uroot -pZXCzxc123
change master to master_host='192.168.8.100',master_port=3339,master_user='slave',master_password='ZXCzxc123',master_log_file='mysql-bin.000004',master_log_pos=154,master_connect_retry=30;
到此为止我们的 slave 就已经配置好了。
如果 执行 show slave status\G;遇到 ERROR: No query specified 那么 原因是 \G后面不需要再加分号; 这样就行 show slave status\G我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为