MySQL: выгрузка результата запроса в файл

Одним из способов является — воспользоваться встроенным функционалом MySQL. Например так мы выгрузим результат запроса в файл формата csv:

select  
	b_form_result.ID, 
	b_form_result.DATE_CREATE, 
	b_form_result.STATUS_ID, 
	b_form_result.FORM_ID, 
	b_form_result_answer.USER_TEXT, 
	b_form_result_answer.ANSWER_TEXT_SEARCH, 
	b_form_result_answer.ANSWER_TEXT, 
	concat("https://wfcwerfe.ru/upload/",SUBDIR,"/",b_file.FILE_NAME) 
from    
	b_form_result  
	left join b_form_result_answer on b_form_result_answer.RESULT_ID=b_form_result.ID 
	left join b_file on b_file.ID=b_form_result_answer.USER_FILE_ID 
where 
	b_form_result.TIMESTAMP_X>"2023-12-06 16:37:26" 
	INTO OUTFILE '/tmp/res.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

PostgreSQL: Завершение процесса запроса

Ситуация: при попытке добавить столбец в одну из таблиц, получил сообщение, что таблица заблокирована из-за процесса с номером Х. «Странно» подумал я, т.к. собственно никаких запросов, тем более «тяжелых» в данный момент не выполнял. Посмотрел текущие запросы и обнаружил:

SELECT user, pid, client_addr, query, query_start, NOW() - query_start AS elapsed
FROM pg_stat_activity
WHERE query != '<IDLE>'
-- AND EXTRACT(EPOCH FROM (NOW() - query_start)) > 1
ORDER BY elapsed DESC;

Что процесс, на который ругалась БД, был запущен еще несколько дней назад, и не понятно по какой причине еще до сих пор не завершен. По идее то бы тут конечно нужно по выяснять, а почему это собственно произошло… но я не стал. А просто завершил процесс:

SELECT pg_cancel_backend(113964)

Исправление распространённых ошибок при тестировании конфигурации Bitrix

Всё ниже перечисленное применимо к Битрикс «Управление сайтом»

Ошибка! Время отличается на 10800 секунд

Прежде чем применять предложенное исправление, необходимо проверить что в консоли терминала и консоли БД время установлено верно.

Исправление: в файле /bitrix/php_interface/after_connect.php нужно добавить строчку:

$DB->Query("SET LOCAL time_zone='".date('P')."'");

Ошибка! Не настроен запуск cron_events.php на cron, последний агент отработал больше суток назад.

Исправление: в /etc/crontab добавить строчку вида:

* * * * *       sleep $((RANDOM\%3)); flock -x -n /tmp/cron_site.lock -c "[ -f /var/www/www-root/data/www/erfwerf.ru/bitrix/php_interface/cron_events.php ] && { sleep $((RANDOM\%50)); timeout 3600 php -f /var/www/www-root/data/www/erfwerf.ru/bitrix/php_interface/cron_events.php; }" >/dev/null 2>&1

Работа с сокетами: Ошибка! Не работает

Исправление:

  • добавить в /etc/hosts имя домена
  • обновить корневые сертификаты:
yum install ca-certificates
update-ca-trust
  • проверить нет ли проблем с сертификатом при выполнении в терминале на сервере
wget https://adiuoe.ru

Если выведет ошибку — установить корректные ssl сертификаты

Недоступны для чтения или записи

При проверке ругается, что часть файлов/папок не доступны для чтения/записи. Для начала выполним команды в корневой папке сайта:

find . -type d -exec chmod 775 {} \;
find . -type f -exec chmod 664 {} \; 

И выставим владельцев (у вас могут быть свои):

find . -type d -exec chown nginx:apache {} \;
find . -type f -exec chown nginx:apache {} \;

Работа с файлами кеша: Ошибка! Не работает

Сервер apache не имеет доступа в папку /bitrix/cache

chmod 777 bitrix/cache/

Yandex map: динамическая загрузка содержимого балуна

Задача: динамически загружать контент по клику на метку, в т.ч. и при кластеризации

Решение:

Добавим события открытия балуна по клике на метку из карты и кластера:

                objectManager.objects.events.add('balloonopen', function (e) {
                    console.log("Открыт балун вне кластера");
                    var id = e.get('objectId'),
                    geoObject = objectManager.objects.getById(id);
                    downloadContent([geoObject], id);
                });          

                objectManager.clusters.events.add('balloonopen', function (e) {
                    var id = e.get('objectId'),
                        cluster = objectManager.clusters.getById(id),
                        geoObjects = cluster.properties.geoObjects;
                        console.log("Открыт балун из кластера..");
                        downloadContent(geoObjects, id, true);
                });   
....
function downloadContent(obj,id,isCluster){    
    console.log("Загружаем объект:");
    aids = obj.map(function (geoObject) {return geoObject.id;});
    if ((obj.length)<200) {
        $("#global").addClass("loading");   
            $.post("?r=inications/get_points_content", {  
            ids:aids,
        }).done(function(data) {            
            obj.forEach(function (geoObject) {
              //console.log("--присваиваем новое тело балуна");                
              if (geoObject.properties.balloonContentBody.includes("<l></l>")){
                //console.log("-подменяю содержимое балуна!");  
                //console.log(geoObject);
                geoObject.properties.balloonContentBody =geoObject.properties.balloonContentBody.replace("<l></l>",data.result[geoObject.id].content);      
                if (isCluster!==true){
                    objectManager.objects.balloon.setData(objectManager.objects.balloon.getData());
                } else {
                    objectManager.clusters.balloon.setData(objectManager.clusters.balloon.getData());
                };
                //setNewData();
              }            
            });                   
            $("#global").removeClass("loading");                    
        });
    } else {
     ToastMessage("error","Кластер слишком велик","Кластер слишком велик для того чтобы его раскрыть. Увеличьте масштаб и попробуйте снова!",6000);   
    };
} 

К сожалению, если в кластере собрано очень много меток (более 200), то обновление идёт довольно долго, потому пришлось немножко ограничить загрузку. В хорошем варианте, нужно бы отслеживать клик по заголовку списка в кластере, но это пока не удалось

Подготовка сервера RED OS 7.3 к установке Битрикс «Управление сайтом»

Дальнейший ход установки предполагает, что у вас уже установлена RED OS в конфигурации программ «Сервер минимальный», без выбора ПО (т.е. php, apache и т.д. будем ставить позже и сами!)

Отключим SELinux:

echo 'SELINUX=disabled' > /etc/sysconfig/selinux
reboot

Настроим отправку почты из консоли:

yum install sendmail –y

Для проверки работы:

echo "Это тестовое письмо " | mail -s "Проверка отправки почты " -r no-reply@mail.ru vasya@mail.ru

Установим PHP 8.1

dnf install php81-release 
dnf clean all
dnf makecache 
dnf  install php php-cli php-common php-devel php-gd php-imap php-json php-ldap php-mbstring php-mysqlnd php-opcache php-pdo php-pear php-pear-DB php-pecl-apcu php-pecl-mcrypt php-pecl-memcache php-pecl-ssh2 php-process php-pspell php-xml php-zipstream php-json php-xml

Если вдруг необходима версия PHP 7.4, которая идёт по умолчанию, то соответственно первая строчка не нужна

Установим Apache и Ngnix

dnf install httpd nginx

Установим MariaDB

dnf install mariadb-server mariadb

Установим Redis

dnf install redis 

Настройка Ngnix

Создадим папку /var/www/html/bx-site, присвоим ей пользователя и группу:

mkdir /var/www/html/bx-site
chown nginx:apache /var/www/html/bx-site

Далее качаем этот архив, и содержимое папки /redos/nginx переписываем поверх в /etc/nginx. Кроме того нужно в /etc/hosts добавить строчку:

127.0.0.1 httpd push

В случае необходимости включить сразу ssl, добавим в файл /etc/ngnix/sites-available/default.conf секцию вида:

server {

    listen 443 ssl;
    server_name _;
    server_name_in_redirect off;

    #ssl on;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/cert.key;


    proxy_set_header    X-Real-IP        $remote_addr;
    proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header    Host $host;

    proxy_redirect ~^(http://[^:]+):\d+(/.+)$ $1$2;
    proxy_redirect ~^(https://[^:]+):\d+(/.+)$ $1$2;

    set $docroot                "/var/www/html/bx-site";

    index index.php;
    root "/var/www/html/bx-site";

    # BXTEMP - personal settings
    include conf.d/bx_temp.conf;

    # Include parameters common to all websites
    include conf.d/bitrix.conf;

}

Если необходима (а она скорее всего необходима) переадрессация с http на https, то в секцию c 80 портом, добавляем строчки:

server {
    listen 80 default_server;
...
  if ($request_uri !~* "/robots.txt") {
        rewrite ^(.*)$ https://$host$1 permanent;
    }
...

Запустим сервис:

systemctl --now enable nginx

Настройка PHP

В папке /etc/php.d необходимо отредактировать настройки модулей:

opcache

opcache.max_accelerated_files = 100000
opcache.revalidate_freq = 0

bitrix.ini

display_errors = Off
error_reporting = E_ALL
error_log = '/var/log/php/error.log'
; Set some more PHP parameters
enable_dl = Off
short_open_tag = On
allow_url_fopen = On
# Security headers
mail.add_x_header = Off
expose_php = Off

Настройка Apache

  • Добавить в /etc/httpd/conf.d файл default.conf из архива выше
  • в httpd.conf заменить Listen 80 на Listen 8090
  • заменить файл /etc/httpd/conf.modules/00-mpm.conf на файл из архива выше

Запустить httpd:

systemctl --now enable httpd

На этом моменте файл index.php размещенный в /var/www/html/bx-site уже должен отображаться адекватно

Настройка MariaDB

В файле /etc/my.cnf.d/mariadb-server.cnf внутри тега [mysqld] необходимо добавить/изменить строки:

[mysqld]
transaction-isolation = READ-COMMITTED
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
thread_cache_size = 4

Запуск сервиса:

systemctl --now enable mariadb

Заходим в консоль сервера mysql, создаём пользователя и даём ему права:

create user 'test'@'localhost' identified by 'password';
create database testdb;
grant all on testdb.* to 'test'@'localhost'

Настройка Redis

В папке /etc/redis необходимо заменить файл redis.conf из архива выше, и выполнить в консоли:

usermod -g apache redis
chown root:apache /etc/redis/ /var/log/redis/
[[ ! -d /etc/systemd/system/redis.service.d ]] && mkdir /etc/systemd/system/redis.service.d
echo -e '[Service]\nGroup=apache' > /etc/systemd/system/redis.service.d/custom.conf
systemctl daemon-reload
systemctl --now enable redis

На этом в принципе и всё. Сервер подготовлен для развертывания битрикса в папке /var/www/html/bx-site. По идее далее кидаем туда дистрибутив (ну или бекап, если сайт переносите как я) и начинаем установку из браузера

1 2 3