Потребовалось 4 дня, чтобы перенести 20 миллионов строк таблицы sqlserver на сервер redhat linux 7.7 Mariadb и выдать 'Mysql client out out memory' - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть одна таблица (содержит pk col) с 20 миллионами строк на сервере SQL на windows. Я хочу перенести эти данные в таблицу MariaDB (10.4) (без шт.) На сервере RedHat Linux через SQL связанный сервер (DRIVER = (MySql ODB C 8.0 ANSI Driver)). Поэтому я создаю на скрипте курсор для вставки каждых 10000 строк по фильтру номеров строк.

declare @starttime datetime,@endtime datetime,@startNum int,@endnum int,@recordcount int,@rowsToCommit int;
declare @TimeinSecond int,@effectedcount int,@logText varchar(2000),@i int;
select @recordcount=count(*) from sqldb..transfer_table
set @rowsToCommit =10000;
set @startNum=1; set @endnum=@rowsToCommit; 
while @endnum <= (@recordcount+@rowsToCommit)
set @i = 1;
begin
set @starttime = GETDATE();
INSERT INTO linkedlinuxmaria...transfer_table(col1,col2,col3,col4,col5)
    SELECT col1,col2,col3,col4,col5 FROM (
    SELECT ROW_NUMBER()OVER(ORDER BY pk1,pk2) AS ROW_NUM,col1,col2,col3,pk1 as col4,pk2 as col5 FROM sqldb..transfer_table
    ) TAB where ROW_NUM between @startNum and @endnum;
set @effectedcount = @@ROWCOUNT;
set @endtime = GETDATE();
set @TimeinSecond = DATEDIFF(SECOND, @StartTime , @EndTime);
set @logText = CAST(@i as varchar(35)) + ','+CAST(@effectedcount as varchar(35)) + ','+  RIGHT('0' + CAST(@TimeinSecond / 3600 AS VARCHAR),2) + ':' 
                + RIGHT('0' + CAST((@TimeinSecond / 60) % 60 AS VARCHAR),2) + ':' +RIGHT('0' + CAST(@TimeinSecond % 60 AS VARCHAR),2);
set @i =@i +1;
RAISERROR (@logText, 10, 1) WITH NOWAIT;
set @startNum = @endnum + 1;
set @endnum = @endnum + @rowsToCommit;
end;

Первоначально для 10000 строк передается его взятое 8 до 10 секунд позже после 4 миллионов строк передано это заняло от 3 до 5 минут времени для следующих каждых 10000 строк для вставки в RedHat Linux MariaDB. Итого потребовалось 3 или 4 дня времени для передачи 19 миллионов строк, а затем было выдано 'Mysql клиенту не хватило памяти '.

log details
........
1   10000   00:00:07
2   10000   00:00:08
3   10000   00:00:08
...........
117  10000  00:00:54   
118  10000  00:00:53  
119  10000  00:00:56    
.........    
255  10000  00:01:47   
256  10000  00:01:47  
257 10000   00:01:49
..........
314  10000  00:02:09  
315  10000  00:02:10  
316  10000  00:02:11
.........
482  10000  00:03:22  
483  10000  00:03:21  
484 10000   00:03:26
.......

Пожалуйста рассмотрите мою проблему и предложите мне.

...