我不确定这是否应该在SuperUser中发布,因为我们在Workbench中使用内置的迁移向导,如果应该移动这个问题,请告诉我.
目标
我们目前正在将数据库从一个服务器迁移到另一个服务器,并且由于MySQL Workbench具有一个称为迁移向导的内置函数,我们认为我们会以快乐的方式迁移它.我们有16种不同的数据库模式需要以不同的大小进行迁移(最小为3 MB,最大为76 GB).
问题
我们开始尝试迁移其中一个中型到大型的,位于14.7 GB并且开始很好但是在它成功迁移了一半的表之后我们得到错误"MySQL服务器已经消失".在确保连接稳定并将其与电缆连接后(可能是无线信号丢失了?)并确保了完全权限并使用root用户进行迁移,我们仍然得到"服务器已经消失"错误.
然后我们尝试使用较小的数据库工作正常,因此我们认为这可能是一个超时问题.我们尝试删除超时设置但我们仍然会为较大的数据库获得相同的错误.真正的踢球者是我们目前正在经历的.
当我们在150 MB数据库上尝试此操作时,迁移向导会正确完成迁移,而不会出现任何错误或警告.出于好奇,我运行了以下代码
SELECT table_name AS "Table",
round(((data_length + index_length) / 1024 / 1024), 2) "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = "TableName"
ORDER BY "Table";
Run Code Online (Sandbox Code Playgroud)
确保表格大小正确.令我们惊讶的是,源数据库中的表总和为150 MB,但目标数据库中的总和为94 MB.
问题
除了超时和特权之外,为什么我们得到"服务器已经消失"错误还有什么其他原因呢?为什么迁移向导会说迁移成功而没有警告或错误,但实际上只有大约60%的数据被迁移?迁移向导不可信,还是不应该信任的表大小查询?我们是否完全错误,即您是否建议另一种更稳定的迁移数据库方式?
如果需要,我很乐意提供更多信息.
编辑:
MySQL版本:5.1.41(Ubuntu)
我们还检查了每个模式中每个表中的行数,虽然大多数都是正确的,但有些错误.这是数据不一致发挥作用的地方.在150 MB/94 MB示例中,有25个表.在这25个表中,23个是正确的,2个不是.在源代码中,其中一个表有257万行,但其中只有150万行最终出现在目标表中.
编辑2:
再次运行相同的查询现在给了我150个中的94个,150个中的8个,150个中的24个,现在是第四次迁移整个数据库.我猜这个问题位于其他地方,但不能为我的生活找出原因.迁移150 MB数据花了92分钟.推断这将给我大约一个月的时间来迁移75 GB的数据库 - 这显然是不对的.
我正在尝试查询数据库并加入两个表.我从来没有使用过Join()这种方式,我在第二个Join()上遇到错误:
var adjustments = data.Inventory_ARCHIVEs
.Where(i => i.Location == comboBox3.Text &&
upcCodes.Contains(i.UPCCode) &&
(i.AVtime.Value.Date >= dateTimePicker1.Value.Date &&
i.AVtime.Value.Date <= dateTimePicker1.Value.AddDays(1).Date) &&
(i.BVtime.Value.Date >= dateTimePicker1.Value.Date &&
i.BVtime.Value.Date <= dateTimePicker1.Value.AddDays(1).Date))
.GroupBy(i => new { i.UPCCode })
.Select(i => new
{
ID = i.Max(x => x.ID),
i.Key.UPCCode
})
.Join(data.Inventory_ARCHIVEs, a => a.ID,
b => b.ID, (a, b) => new { a, b })
.Join(data.BQItems, x => new { x.a.UPCCode, x.b.Location },
y => new { y.UPC_Code, y.Location }, (x, y) => new
{ …Run Code Online (Sandbox Code Playgroud) 我正在为一个新项目设计数据库,我不确定是否应该使用INT,CHAR或VARCHAR作为员工的社会安全号码.在我的国家,SSN由11位数字组成.
请注意,我将在此表上使用ID列作为主键,因此SSN不会用作密钥.
INT注意事项:无法在列上错误地存储文本,这很好,但我无法确保插入的值具有正确的位数.
CHAR注意事项:我可以确保条目具有正确的位数,但我不能确定这些是数字,并且SSN的长度将来可能会增加.
VARCHAR注意事项:没有其他两个的任何好处,但是是最灵活的,例如,如果长度改变则不会受到影响.
SSN是否有标准数据类型?你们用的是什么?
背景
我一直在做一些自定义模块开发(在社区文件夹中)并且已经取得了很大的进步.我的安装脚本创建了许多新的Magento实体(及其数据库表)和一些自定义属性.
我正在进行前端产品视图自定义(从我的自定义实体数据库表中提取一些信息),并需要创建一些新的产品进行测试.当我去创建(特别是保存)一个新产品我得到的是一个空白的白页.
所以,我检查了System.log:
User Error: Some transactions have not been committed or rolled back
Run Code Online (Sandbox Code Playgroud)
没有例外,因此我启用了MySql日志记录,并获得了以下内容:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'XXXXXX.catalog_category_flat_store_1
Run Code Online (Sandbox Code Playgroud)
这个StackOverflow帖子解决了这个错误......那种
到目前为止的努力
由于我的模块创建了一些数据库表(并为它们添加了一些索引),我认为我必须做错了哪些损坏了Magento的索引.所以,我安装了一个全新的Magento实例==>没问题; 我可以很好地创建/编辑产品.
接下来,我安装了我的模块,但注释掉了我的所有install-0.0.1.php(读取:NO DATABASE MANIPULATION),除了startSetup()和endSetup() - 我的计划是逐个表,看看Some transactions have not been committed or rolled back错误何时重新出现.
然而,令我惊讶的是,即使我的模块的setup.php没有触及数据库,产品创建/编辑问题也立即重新出现.
因此,工作和不工作之间发生的唯一变化是我的模块的安装,但我的模块没有触及Magento的数据库.
题
非常感谢您的任何帮助或想法!
我有两个表,用户和部门.我想拥有表,其中有两列:第一个是部门名称,第二个是计数 - 分配给该部门的用户数量.我有这段代码:
SELECT department_name as 'deptName',
COUNT(users.department_id) as 'userCount'
FROM departments
LEFT OUTER JOIN users
ON departments.id = users.department_id
GROUP BY 'deptName'
Run Code Online (Sandbox Code Playgroud)
部门的表格列是:
integer id PK
varchar(20) department_name
Run Code Online (Sandbox Code Playgroud)
用户的表列是:
integer id PK
varchar(20) name
varchar(20) surname
int department_id FK
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
现在我有2个部门,输出应该是2行,第一个是计数8,第二个是计数1. 但我只看到一行,所有计数(9). 我使用安装了XAMPP的MySQL.
我忘了在安装Oracle DB时输入sys,system和hr密码,然后单击OK,但现在对于SQ * Plus,它需要那些凭据才能在命令提示符下登录。如何获取默认的用户名和密码?
最近我安装了Mysql,事实证明它的服务名称是"mysql"(没有"d"后缀),我记得在此之前它一直是"mysqld".当你输入"sudo service mysqld status"时,它会说这个服务不存在.
这两个有什么区别吗?或者它是mysql的完全不同版本?
我正在使用Flask框架,正在尝试从数据库中删除条目。下面的代码给出此错误:“该方法不允许用于所请求的URL。”
在html中:
<form action="{{ url_for('delete_entry', id=entry.id) }}" method="POST">
<input type="hidden" name="_method" value="DELETE" />
<input type="submit" value="Delete entry" />
</form>
Run Code Online (Sandbox Code Playgroud)
在py中:
@app.route('/delete', methods=['DELETE'])
def delete_entry(postID):
if not session.get('logged_in'):
abort(401)
g.db.execute('delete from entries WHERE id = ?', [postID])
flash('Entry was deleted')
return redirect(url_for('show_entries'))
Run Code Online (Sandbox Code Playgroud)
然后如何从html到py获取正确的postID?
所以我发现了一些问题,说你必须覆盖getAuthPassword()以从数据库中提供密码列的自定义名称.尝试将此方法与数据库中的列同名,并且无法正常工作.它仍然会发出此错误:未定义的索引:密码.
这是认证:
if (Auth::attempt(Input::only('user_displayName'), Input::get('user_password')))
Run Code Online (Sandbox Code Playgroud)
尝试在表单和控制器中将user_password更改为密码无效.
所以问题是,如果我在名为"user_password"的数据库中有一个列,是否有办法让Auth工作?
PS检查了我发现的每个旧解决方案
编辑
用户表的结构:
+======================+
| User |
+======================+
| user_id |
+----------------------+
| user_displayName |
+----------------------+
| user_fname |
+----------------------+
| user_lname |
+----------------------+
| user_email |
+----------------------+
| user_password |
+----------------------+
| created_at |
+----------------------+
| updated_at |
+----------------------+
Run Code Online (Sandbox Code Playgroud) 我在PostgreSQL 9.2中有一个包含text列的表.我们称之为text_col.此列中的值非常独特(最多可包含5-6个重复项).该表有大约500万行.这些行中大约有一半包含null值text_col.当我执行以下查询时,我期望1-5行.在大多数情况下(> 80%)我只期望1排.
explain analyze SELECT col1,col2.. colN
FROM table
WHERE text_col = 'my_value';
Run Code Online (Sandbox Code Playgroud)
一个btree索引存在于text_col.查询规划器从不使用此索引,我不确定原因.这是查询的输出.
Seq Scan on two (cost=0.000..459573.080 rows=93 width=339) (actual time=1392.864..3196.283 rows=2 loops=1)
Filter: (victor = 'foxtrot'::text)
Rows Removed by Filter: 4077384
Run Code Online (Sandbox Code Playgroud)
我又增加了部分指标,试图筛选出不空的值,但这并没有帮助(有或没有text_pattern_ops.我不需要text_pattern_ops考虑任何LIKE条件,在我的查询表示,但他们也符合平等).
CREATE INDEX name_idx
ON table
USING btree
(text_col COLLATE pg_catalog."default" text_pattern_ops)
WHERE text_col IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
使用序列扫描禁用set enable_seqscan = off;使计划程序仍然选择seqscan了 …