蘇z 发布的文章

mongodb 备份与恢复

题外话

我服务器上的mongodb是使用自动化工具安装的,所以并不知道他的配置文件在哪里,首先使用

ps -ef|grep mongodb这个命令查看mongodb的启动命令,不出意外就能看到配置文件在哪里,拿到配置文件后可以进行一些操作。

备份

进入正题,如何备份mongodb的数据,众所周知,mongodb中也是有数据库这个概念的,我们可以使用mongodump这个命令使整个数据库以二进制的方式备份下来,具体使用方式如下

mongodump -h dbhost -d dbname -o targetdirectory

-h:
MongoDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

-d:
需要备份的数据库实例,例如:test

-o:
备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

恢复

恢复可以使用mongorestore命令

mongorestore -h <hostname><:port> -d dbname <path>

--host <:port>, -h <:port>:
MongoDB所在服务器地址,默认为: localhost:27017

--db , -d :
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

--drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!

<path>:
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。

你不能同时指定 <path> 和 --dir 选项,--dir也可以设置备份目录。

--dir:
指定备份的目录

你不能同时指定 <path> 和 --dir 选项。

/*
* 从Web 端 HIKVISION 获取下载图片xml信息脚本
* 下载后可以根据xml里面的信息去下载图片
* 最好使用“国产浏览器”可以实现自动下载,如果使用新版本谷歌浏览器的话,每一次的下载请求都需要手动确认才能完成下载
*
* 另外此段代码里的xml正确性验证结果不可靠,
* 需要靠其它方法进行辅助验证
* */
var trackID = '';
var nowCamera = 1;
var allCamera = 48;

var searchID = `C92FD0F0-4200-0001-D8B6-8FA61C171A56`;

//  起始day
var st_int_b = 11;
// 终止day
var et_int = 20;
var st_int = st_int_b;
// 当前month
var month = 11;
// 当前year
var year = 2021;

var maxResults = 50
var searchResultPostion = 0

var resultXML = null;

// 每次请求的间隔
var delay = 0.06;
var nextDelay = 0.2;

// 由于服务器限制单次连续请求最高可获取4000条数据,所以需要根据实际情况调整获取数据的时间尺度来防止数据获取不完整
var sTimeRear = ['00:00:00Z', '03:00:00Z', '06:00:00Z', '09:00:00Z', '12:00:00Z', '15:00:00Z', '18:00:00Z', '21:00:00Z']
var eTimeRear = ['02:59:59Z', '05:59:59Z', '08:59:59Z', '11:59:59Z', '14:59:59Z', '17:59:59Z', '20:59:59Z', '23:59:59Z']
var timePoint = 0;
var Num_Times_Segments = sTimeRear.length; // 分段长度
// var sTimeRear = '00:00:00Z';
// var mTimeRear = '12:59:59Z';
// var msTimeRear = '13:00:00Z';
// var eTimeRear = '23:59:59Z';

var aTimeRear = sTimeRear[timePoint];
var bTimeRear = eTimeRear[timePoint];

function startRequest(){
    aTimeRear = sTimeRear[timePoint];
    bTimeRear = eTimeRear[timePoint];
    trackID = nowCamera + '03';

    console.log('执行请求:' + searchResultPostion);
    var startTime = `${year}-${PrefixInteger(month, 2)}-${PrefixInteger(st_int, 2)}T${aTimeRear}`
    var endTime = `${year}-${PrefixInteger(month, 2)}-${PrefixInteger(st_int, 2)}T${bTimeRear}`
    let queryXML = `<?xml version: "1.0" encoding="utf-8"?><CMSearchDescription><searchID>${searchID}</searchID><trackList><trackID>${trackID}</trackID></trackList><timeSpanList><timeSpan><startTime>${startTime}</startTime><endTime>${endTime}</endTime></timeSpan></timeSpanList><contentTypeList><contentType>metadata</contentType></contentTypeList><maxResults>${maxResults}</maxResults><searchResultPostion>${searchResultPostion}</searchResultPostion><metadataList><metadataDescriptor>//recordType.meta.std-cgi.com/allPic</metadataDescriptor></metadataList></CMSearchDescription>`

    $.ajax({
        type:'post',
        url:'http://170.2.229.50/ISAPI/ContentMgmt/search',
        data: queryXML,
        success: processXML,
    })
}

function processXML(xml){
    let resStatus = xml.getElementsByTagName('responseStatus');
    let isContinue = xml.getElementsByTagName('responseStatusStrg')[0].innerHTML;

    if (resStatus[0].innerHTML === 'true')
    {
        switch (isContinue){
            // 还要继续请求
            case 'MORE':
                // 合法性判断
                // 如果不合法将会重复此次请求
                if (judgeStringXMLISRight(XMLToString(xml)) === 0) {
                    delXML(xml);

                    searchResultPostion += maxResults;
                }

                setTimeout(startRequest, 1000 * delay);
                break;
            // 请求完毕
            case 'OK':
                // 合法性判断
                if (judgeStringXMLISRight(XMLToString(xml)) === 0) {
                    delXML(xml);

                    if (timePoint < Num_Times_Segments - 1)
                    {
                        ++timePoint;

                        searchResultPostion = 0;
                        setTimeout(startRequest, 1000 * delay);
                    }
                    else
                    {
                        nextDay();
                    }
                } else {
                    setTimeout(startRequest, 1000 * delay);
                }

                break;
            // 无结果
            case "NO MATCHES":
                console.log('no matches')
                if (timePoint < Num_Times_Segments - 1)
                {
                    ++timePoint;

                    searchResultPostion = 0;
                    setTimeout(startRequest, 1000 * delay);
                }
                else
                {
                    nextDay();
                }
                // nextDay();
                break ;
        }
    }
    else
    {
        console.log('*************出错***************')
    }

    console.log(resultXML !== null ? resultXML.getElementsByTagName('searchMatchItem').length : 0);

    function delXML(xml){
        if (!resultXML)
            resultXML = xml;
        else
        {
            let items = resultXML.getElementsByTagName('matchList')[0];
            // let length = parseInt(xml.getElementsByTagName('numOfMatches')[0]);

            let newNode = xml.getElementsByTagName('searchMatchItem');
            for (let i = 0; i < newNode.length; ++i)
            {
                items.appendChild((newNode[i]).cloneNode(true));
            }
        }
    }
}

function nextDay(){
    timePoint = 0;

    ++st_int;
    if (st_int <= et_int)
    {
        searchResultPostion = 0;
        setTimeout(startRequest, 1000 * nextDelay);
    }
    else{
        console.log('将保存数据:' + (resultXML !== null ? resultXML.getElementsByTagName('searchMatchItem').length : 0) + '条');
        let fileName = 'D' + nowCamera + '03__' + PrefixInteger(month, 2) + PrefixInteger(st_int_b, 2) + '_' + PrefixInteger(month, 2) + PrefixInteger(et_int, 2) + '__' + getLocalTime() + '__' + (resultXML !== null ? resultXML.getElementsByTagName('searchMatchItem').length : 0) + '.xml.txt';

        if (resultXML === null)
        {
            console.log('无数据. . .');
            // exportRaw(fileName, '');
        }
        else
        {
            let serializer = new XMLSerializer();
            let str = serializer.serializeToString(resultXML);

            exportRaw(fileName, str);
        }

        console.log('export:' + fileName);

        nextCamera();
    }
}

function nextCamera(){
    ++nowCamera;
    if (nowCamera <= allCamera)
    {
        searchResultPostion = 0;
        st_int = st_int_b;
        resultXML = null;

        setTimeout(startRequest, 1000 * nextDelay);
    }
    else
    {
        console.log('任务结束');
    }
}

function formatURI(xml){
    let urls = xml.getElementsByTagName('playbackURI');
    for (let i = 0; i < urls.length; ++i)
    {
        let t = urls[i].innerHTML.toString();
        let tn = document.createTextNode(t.replaceAll('amp;', ''))
        urls[i].removeChild(urls[i].firstChild);
        urls[i].appendChild(tn)
        // console.log(urls[i].innerHTML)
    }

    console.log(urls)
    return xml;
}

function PrefixInteger(num, length) {
    return (Array(length).join('0') + num).slice(-length);
}

function fakeClick(obj) {
    var ev = document.createEvent("MouseEvents");
    ev.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    obj.dispatchEvent(ev);
}

function exportRaw(name, data) {
    var urlObject = window.URL || window.webkitURL || window;
    var export_blob = new Blob([data]);
    var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
    save_link.href = urlObject.createObjectURL(export_blob);
    save_link.download = name;
    fakeClick(save_link);
}

String.prototype.replaceAll = function(s1, s2) {
    return this.replace(new RegExp(s1, "gm"), s2);
}

//获取一个类似“2018-11-02_19-52”格式的时间字符串,时间信息为调用时间
function getLocalTime ()
{
    let currentTime = new Date();

    let currentTimeStr = '';

    currentTimeStr += currentTime.getFullYear() + "-";
    currentTimeStr += PrefixInteger(currentTime.getMonth() + 1, 2);
    currentTimeStr += "-";
    currentTimeStr += PrefixInteger(currentTime.getDate(), 2);
    currentTimeStr += '_' + PrefixInteger(currentTime.getHours(), 2) + "-" + PrefixInteger(currentTime.getMinutes(), 2)
    return currentTimeStr;
}

// 将xml document 转为string
function XMLToString(xmlDocument) {
    let serializer = new XMLSerializer();
    return serializer.serializeToString(xmlDocument);
}

// 判断字符型的xml文件是否合规
function judgeStringXMLISRight(xmlString) {
    let parser = new DOMParser();
    let xmlDoc = parser.parseFromString(xmlString, 'text/xml')

    let error = xmlDoc.getElementsByTagName("parsererror");
    if (error.length > 0)
    {
        console.log("格式错误");

        return -1;
        // if(xmlDoc.documentElement.nodeName === "parsererror"){
        //     errorCode = 1;
        //     errorMessage = xmlDoc.documentElement.childNodes[0].nodeValue;
        // } else {
        //     errorCode = 1;
        //     errorMessage = xmlDoc.getElementsByTagName("parsererror")[0].innerHTML;
        // }
    }
    else
    {
        console.log("格式正确");

        return 0;
    }
}
// 3264
/*
1072
240
1018
998
1072 + 240 + 1018 + 998
*/

生气,至今不晓得是chrome的锅还是antd的锅

问题描述

就是使用这个组件nz-range-picker的时候出现卡顿的情况,可以用,但是选择日期的时候会卡住5秒左右,简直令人崩溃,有个专门测试的项目,在测试项目中使用这个组件可以正常用,所以就考虑是不是自己哪里没有配置好,一个劲的折腾,甚至重新用ng add的方式从新装了anti框架,然而无果,然后真的是没有办法了,在网上也没搜到类似的问题。
因为网页使用的别人的静态网页模板,所以还一直担心是不是起了冲突。索性一跺脚就决定新建项目并一点点迁移项目,项目还小,所以还经得起折腾,/(ㄒoㄒ)/~~

问题解决

最最令人崩溃甚至绝望的是我新建了项目,配置了antd框架,什么也没干,只添加了nz-range-picker这个日期选择组件,结果结果结果竟然依然卡顿,简直怀疑人生嗨,不可能啊,怎么会出现这种事情呢。
然后然后,灵光一现把网页在隐身模式下运行了一下,好吧,正常了。最后当然就是清除浏览器缓存,重启浏览器最后解决了。
问题是解决了,但是。。。心情沉重(。・∀・)ノ゙嗨

再次更新

可能上述的并不是正确的解决方法,因为之后还是频频再现问题,具体表现为,打开后不卡,打开几次后就又卡。经过测试换最新版谷歌内核的Edge浏览器一直不会出现此问题。So,到底锅该谁背?????

只对一些简单的限制有效,打开控制台(F12)输入以下代码回车运行即可.

document.oncontextmenu = '';
document.onselectstart = '';
document.oncopy = '';
document.onkeydown = '';

我碰到一种情况需要在文本上检查元素后,点击Event Listeners(一个panel,可能会折叠,要仔细找下),有关事件才会绑定,输入以上代码才会有效。

解压许可驱动

进入iServer解压的文件目录 support/SuperMap_License/Support

解压许可驱动
tar -xvf aksusbd-2.4.1-i386.tar
进入生成的目录cd aksusbd-2.4.1-i386
运行./dinst ,默认有3个月使用许可

更新许可

从系统根目录进入/opt/SuperMap/License(自己建立目录也可以)
然后把许可文件放进这个文件夹即可,申请许可时,计算机名胡乱填写也可以