• Mongodb 副本集名称重命名


    副本集重命名

    要重命名副本集,您必须关闭副本集的所有成员,然后使用新的副本集名称配置每个成员的数据库。

    此过程需要停机。

    先决条件

    确保您的副本集未分片。重命名过程仅适用于未分片的副本集。

    在重命名副本集之前,请 对 MongoDB 部署执行完整备份。

    做好备份非常重要,无论如何,请先在测试环境验证后再执行该操作

    启用身份验证后,请确保您的用户角色对每个成员数据库中的集合具有 find、insert 和 remove 权限。

    db.runCommand(
        {
          rolesInfo: { role: "xxxxx", db: "yyyyyy" },
          showPrivileges: true
        }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    授权

    db.getUser("admin")
    {
            "_id" : "admin.admin",
            "userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),
            "user" : "admin",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
    
    db.createRole(
       {
         role: "collectionRole",
         privileges: [
          { resource: { db: "local", collection: "system.replset" }, actions: [ "find", "remove", "insert" ] }
        ],
         roles: []
       }
    )
    
    db.grantRolesToUser("admin",[{"role":"collectionRole","db":"admin"}])
    
    
    db.getUser("admin")
    {
            "_id" : "admin.admin",
            "userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),
            "user" : "admin",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    },
                    {
                            "role" : "collectionRole",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    关闭副本集成员

    此步骤需要停机,因为所有副本成员都需要关闭。

    当前副本集名称 “set” : “sit_rs1”

    {
            "set" : "sit_rs1",
            "date" : ISODate("2023-11-10T08:08:08.707Z"),
            "myState" : 1,
            
    		......
    		 
            "members" : [
                    {
                            "_id" : 1,
                            "name" : "192.168.88.11:27018",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                             ......
                    },
                    {
                            "_id" : 3,
                            "name" : "192.168.88.11:27017",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            ......
                    },
                    {
                            "_id" : 4,
                            "name" : "192.168.88.11:27019",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            .....
                    }
            ],
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1699603684, 1),
                    "signature" : {
                            "hash" : BinData(0,"yDDKmbDiNNhNxzN+xh20IjGyr3o="),
                            "keyId" : NumberLong("7236938018798436354")
                    }
            },
            "operationTime" : Timestamp(1699603684, 1)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    关闭副本集成员,三台都关闭

    # shutdown 27019
    su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb27019/data  --port 27019  --shutdown"
    
    # shutdown 27018
    su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb27018/data  --port 27018  --shutdown"
    
    # shutdown 27017
    su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb/data  --port 27017  --shutdown"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    重命名副本集

    对每个副本集成员执行以下步骤: ( 以其中一台 27019 为例 )

    • 不带 --replSet 该选项 的情况下在不同端口上启动副本集成员 (如下注释掉 replication 选项。 端口改为 28019
    root@ubuntu-x64_01:/opt# cat /etc/mongod27019.conf  
    systemLog:
       destination: file
       path: "/data/mongodb27019/log/mongod.log"
       logAppend: true
    storage:
       dbPath: "/data/mongodb27019/data"
       journal:
          enabled: true
       directoryPerDB: true
    processManagement:
       fork: true  
    net:
       bindIp: localhost,192.168.88.11
       #port: 27019
       port: 28019
       maxIncomingConnections: 65536
    security:
       keyFile: "/data/mongodb27019/data/replsetAIK"
       clusterAuthMode: "keyFile"
       authorization: enabled
    #replication:
    #   replSetName: "sit_rs1"
    #   enableMajorityReadConcern: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    启动副本集成员:

    root@ubuntu-x64_01:/opt# su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --config /etc/mongod27019.conf 2>&1 >/dev/null &"
    
    • 1

    更新副本集名称。

    如果使用配置文件,请设置 replication.replSetName 为新名称。replSetName: “sit_rs1” 变更为 replSetName: “local_rs1”

    root@ubuntu-x64_01:/opt# cat /etc/mongod27019.conf 
    systemLog:
       destination: file
       path: "/data/mongodb27019/log/mongod.log"
       logAppend: true
    storage:
       dbPath: "/data/mongodb27019/data"
       journal:
          enabled: true
       directoryPerDB: true
    processManagement:
       fork: true  
    net:
       bindIp: localhost,192.168.88.11
       #port: 27019
       port: 28019
       maxIncomingConnections: 65536
    security:
       keyFile: "/data/mongodb27019/data/replsetAIK"
       clusterAuthMode: "keyFile"
       authorization: enabled
    replication:
       replSetName: "local_rs1"
       enableMajorityReadConcern: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    使用以下命令更新本地数据库中的副本集名称:

    > use local 
    switched to db local
    
    > db.system.replset.find().pretty()
    {
            "_id" : "sit_rs1",
            "version" : 20,
            "term" : 249,
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "members" : [
                    {
                            "_id" : 1,
                            "host" : "192.168.88.11:27018",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 3,
                            "host" : "192.168.88.11:27017",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 4,
                            "host" : "192.168.88.11:27019",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("6305db8beb57aaf6f57b130e")
            }
    }
    
    
    
    
    > var newId = 'local_rs1'
    
    > var doc = db.getSiblingDB("local").system.replset.findOne()
    
    > var oldId = doc._id
    
    > print(oldId, newId)
    sit_rs1 local_rs1
    
    > doc._id = newId
    local_rs1
    
    > db.getSiblingDB("local").system.replset.insertOne(doc)
    { "acknowledged" : true, "insertedId" : "local_rs1" }
    
    > db.getSiblingDB("local").system.replset.deleteOne({_id: oldId})
    { "acknowledged" : true, "deletedCount" : 1 }
    
    
    > db.getSiblingDB("local").system.replset.find().pretty()
    {
            "_id" : "local_rs1",
            "version" : 20,
            "term" : 249,
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "members" : [
                    {
                            "_id" : 1,
                            "host" : "192.168.88.11:27018",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 3,
                            "host" : "192.168.88.11:27017",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 4,
                            "host" : "192.168.88.11:27019",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("6305db8beb57aaf6f57b130e")
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156

    关闭副本集成员,在其原始端口上启动副本集成员。如果使用配置文件,请确保将其 replication.replSetName 已经设置为新的副本集名称。

    replication:
       replSetName: "local_rs1"
       enableMajorityReadConcern: true
    
    • 1
    • 2
    • 3

    在其原始端口上启动副本集成员。

    root@ubuntu-x64_01:/opt#  cat /etc/mongod27019.conf
    systemLog:
       destination: file
       path: "/data/mongodb27019/log/mongod.log"
       logAppend: true
    storage:
       dbPath: "/data/mongodb27019/data"
       journal:
          enabled: true
       directoryPerDB: true
    processManagement:
       fork: true  
    net:
       bindIp: localhost,192.168.88.11
       port: 27019
       maxIncomingConnections: 65536
    security:
       keyFile: "/data/mongodb27019/data/replsetAIK"
       clusterAuthMode: "keyFile"
       authorization: enabled
    replication:
       replSetName: "local_rs1"
       enableMajorityReadConcern: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    按上面的操作,在另外两个实例都执行一遍后, 执行修改后,整个副本集状态如下:

    local_rs1:PRIMARY> rs.status()
    {
            "set" : "local_rs1",
            "date" : ISODate("2023-11-15T11:25:05.087Z"),
            "myState" : 1,
            "term" : NumberLong(251),
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "heartbeatIntervalMillis" : NumberLong(2000),
            "majorityVoteCount" : 2,
            "writeMajorityCount" : 2,
            "votingMembersCount" : 3,
            "writableVotingMembersCount" : 3,
            "optimes" : {
                    "lastCommittedOpTime" : {
                            "ts" : Timestamp(1700047503, 1),
                            "t" : NumberLong(251)
                    },
                    "lastCommittedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                    "readConcernMajorityOpTime" : {
                            "ts" : Timestamp(1700047503, 1),
                            "t" : NumberLong(251)
                    },
                    "readConcernMajorityWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                    "appliedOpTime" : {
                            "ts" : Timestamp(1700047503, 1),
                            "t" : NumberLong(251)
                    },
                    "durableOpTime" : {
                            "ts" : Timestamp(1700047503, 1),
                            "t" : NumberLong(251)
                    },
                    "lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                    "lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z")
            },
            "lastStableRecoveryTimestamp" : Timestamp(1700047503, 1),
            "electionCandidateMetrics" : {
                    "lastElectionReason" : "electionTimeout",
                    "lastElectionDate" : ISODate("2023-11-15T11:16:43.867Z"),
                    "electionTerm" : NumberLong(251),
                    "lastCommittedOpTimeAtElection" : {
                            "ts" : Timestamp(0, 0),
                            "t" : NumberLong(-1)
                    },
                    "lastSeenOpTimeAtElection" : {
                            "ts" : Timestamp(1699610346, 1),
                            "t" : NumberLong(249)
                    },
                    "numVotesNeeded" : 2,
                    "priorityAtElection" : 1,
                    "electionTimeoutMillis" : NumberLong(10000),
                    "numCatchUpOps" : NumberLong(0),
                    "newTermStartDate" : ISODate("2023-11-15T11:16:43.877Z"),
                    "wMajorityWriteAvailabilityDate" : ISODate("2023-11-15T11:16:44.535Z")
            },
            "members" : [
                    {
                            "_id" : 1,
                            "name" : "192.168.88.11:27018",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 511,
                            "optime" : {
                                    "ts" : Timestamp(1700047503, 1),
                                    "t" : NumberLong(251)
                            },
                            "optimeDurable" : {
                                    "ts" : Timestamp(1700047503, 1),
                                    "t" : NumberLong(251)
                            },
                            "optimeDate" : ISODate("2023-11-15T11:25:03Z"),
                            "optimeDurableDate" : ISODate("2023-11-15T11:25:03Z"),
                            "lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                            "lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                            "lastHeartbeat" : ISODate("2023-11-15T11:25:04.468Z"),
                            "lastHeartbeatRecv" : ISODate("2023-11-15T11:25:03.448Z"),
                            "pingMs" : NumberLong(0),
                            "lastHeartbeatMessage" : "",
                            "syncSourceHost" : "192.168.88.11:27019",
                            "syncSourceId" : 4,
                            "infoMessage" : "",
                            "configVersion" : 20,
                            "configTerm" : 251
                    },
                    {
                            "_id" : 3,
                            "name" : "192.168.88.11:27017",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 26,
                            "optime" : {
                                    "ts" : Timestamp(1700047503, 1),
                                    "t" : NumberLong(251)
                            },
                            "optimeDurable" : {
                                    "ts" : Timestamp(1700047503, 1),
                                    "t" : NumberLong(251)
                            },
                            "optimeDate" : ISODate("2023-11-15T11:25:03Z"),
                            "optimeDurableDate" : ISODate("2023-11-15T11:25:03Z"),
                            "lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                            "lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                            "lastHeartbeat" : ISODate("2023-11-15T11:25:04.520Z"),
                            "lastHeartbeatRecv" : ISODate("2023-11-15T11:25:04.285Z"),
                            "pingMs" : NumberLong(0),
                            "lastHeartbeatMessage" : "",
                            "syncSourceHost" : "192.168.88.11:27019",
                            "syncSourceId" : 4,
                            "infoMessage" : "",
                            "configVersion" : 20,
                            "configTerm" : 251
                    },
                    {
                            "_id" : 4,
                            "name" : "192.168.88.11:27019",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 16264,
                            "optime" : {
                                    "ts" : Timestamp(1700047503, 1),
                                    "t" : NumberLong(251)
                            },
                            "optimeDate" : ISODate("2023-11-15T11:25:03Z"),
                            "lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                            "lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),
                            "syncSourceHost" : "",
                            "syncSourceId" : -1,
                            "infoMessage" : "",
                            "electionTime" : Timestamp(1700047003, 1),
                            "electionDate" : ISODate("2023-11-15T11:16:43Z"),
                            "configVersion" : 20,
                            "configTerm" : 251,
                            "self" : true,
                            "lastHeartbeatMessage" : ""
                    }
            ],
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1700047503, 1),
                    "signature" : {
                            "hash" : BinData(0,"FkEFPk5B3ZB364V3c3RkkEoBChI="),
                            "keyId" : NumberLong("7236938018798436354")
                    }
            },
            "operationTime" : Timestamp(1700047503, 1)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149

    回收权限,由于角色是临时授权的,操作结束后,回收该集合的变更权限

    local_rs1:PRIMARY> use admin 
    switched to db admin
    
    local_rs1:PRIMARY> db.getUser("admin")
    {
            "_id" : "admin.admin",
            "userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),
            "user" : "admin",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    },
                    {
                            "role" : "collectionRole",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
    
    local_rs1:PRIMARY> db.revokeRolesFromUser("admin",[{"role":"collectionRole","db":"admin"}])
    
    local_rs1:PRIMARY> db.getUser("admin")
    {
            "_id" : "admin.admin",
            "userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),
            "user" : "admin",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    js 采集pcm,并封装为wav,包含重采样,提供下载
    【EFK】基于K8S构建EFK+logstash+kafka日志平台
    以太坊(The Merge)合并终于完成,它在未来还需要做什么?
    如何使用 iMazing 3许可证激活软件及2024最新常见问题详细解答
    Linux C/C++ 学习笔记(八):实现http客户端请求
    swift 函数类型+高阶函数
    关于香港高防IP需要关注的几个问题
    C#《原CSharp》第三回 万文疑谋生思绪 璃月港口见清玉
    22-08-08 西安 尚医通(04)MongoDB命令、MongoTemplate、MongoRepository
    day06-Flex布局
  • 原文地址:https://blog.csdn.net/qq_33158376/article/details/134334618